"After working with the so called "Fingerprint" for a while now I never really understood and still wonder why we introduced this in the first place. (And I know other team members feel the same way.) What it basically did was moving some methods deeper. I'm not sure what actual problem that solved (that could not been solved in an other, less disruptive way) but I know it introduced quite a few new ones (like not being able to use clone on entity objects any more). I suggest to drop it and replace it with the following interfaces in DataModel 3.0.0:
interface LabeledDocument { public function getLabels(); public function setLabels( /* TBD */ ); public function hasLabel( $languageCode ); public function getLabel( $languageCode ); public function setLabel( $languageCode, $text ); public function removeLabel( $languageCode ); } interface DescribedDocument { public function getDescriptions(); public function setDescriptions( /* TBD */ ); public function hasDescription( $languageCode ); public function getDescription( $languageCode ); public function setDescription( $languageCode, $text ); public function removeDescription( $languageCode ); } interface AliasedDocument { /* TBD */ }
Also see how the Java DataModel does this."
https://github.com/wmde/WikibaseDataModel/issues/301