add an ExternalIdentifier class to encapsulate what varies