Just as the reusability of domain models from application to application is essential,
the reusability of metamodels from domain to domain is also an important consideration.
Ideally, a library of metamodels of important sub-domains should be made available to
the metamodeler, who can extend and compose them together to specify domain languages.
These sub-domains might include different variations of signal-flow, finite state machines,
data type specifications, fault propagation graphs, petri-nets, etc. The extension and
composition mechanisms must not modify the original metamodels, just as subclasses do
not modify baseclasses in OO programming. Then changes in the metamodel libraries,
reflecting a better understanding of the given domain, for example, propagate to the
metamodels that utilize them. Furthermore, by precisely specifying the extension and
composition rules models specified in the original domain language can be automatically
translated to comply with the new, extended and composed, modeling language.
The GME metamodeling language is based on UML class diagrams. However, to support
metamodel composition, some new operators are necessary. The equivalence operator is
used to represent the union of two UML class objects. The two classes cease to be
separate entities, but form a single class instead. Thus, the union includes all
attributes, compositions and associations of each individual class. Equivalence can
be thought of as defining the "join points" or "composition points" of two or more
source metamodels. New operators were also introduced to provide finer control over
inheritance. When the new class needs to be able to play the role of the base class,
but its internals need not be inherited, we use interface inheritance. In this case,
all associations and those compositions where the base class plays the role of the
child are inherited. On the other hand, when only the internals of a class are needed
by a subclass, we use implementation inheritance. In this case, all the attributes
and those compositions where the base class plays the role of the parent are inherited.
Notice that the union of these two new inheritance operators is the "regular" UML
inheritance.