The base metamodel is abstract, so you must have a concrete
extension of it.
We have created two extensions : one default base extension and other
with an example with derived features.
Those extensions are in KM3 format (depends of ATL plugin).
This metamodel extension is designed to weave a left and a right model/metamodel (if you want to add other models, remove comments for the reference others).
This metamodel extension allows the creation of a link with two extrimities (left and right).
Its name is "mw_base_extension.km3".
All abstract classes are extended.

In the syntax of km3, we have this :
package mw_base_ext {
class Model extends WModel {
-- @subsets wovenModel
reference leftModel container : WModelRef;
-- @subsets wovenModel
reference rightModel container : WModelRef;
--reference others[*] container subsets wovenModel : WModelRef;
}
-------------------------------------------------------------------
-- @wmodelRefType ModelRef
class ElementRef extends WElementRef {
}
-- @welementRefType ElementRef
class ModelRef extends WModelRef {
}
-- @welementRefType ElementRefXMI
class ModelRefXMI extends WModelRef {
}
-- @wmodelRefType ModelRef
class ElementRefXMI extends WElementRef{
}
-------------------------------------------------------------------
class Association extends WAssociation {
}
class AssociationEnd extends WAssociationEnd {
}
--------------------------------------------------------------------
class Link extends WLink {
-- @subsets end
reference left container : WLinkEnd oppositeOf link;
-- @subsets end
reference right container : WLinkEnd oppositeOf link;
}
class LinkEnd extends WLinkEnd {
}
}
Its name is "derived_features.km3". You can use it with default base extension. You cant' use alone (all abstract classes are not extended)


Using the KM3 syntax :
package derived_features {
class Supplier extends WLink {
reference orders[*] container: PurchaseOrder oppositeOf linkOrder;
-- @subsets orders
reference supplier[*] container : PurchaseOrder oppositeOf linkSupplier;
-- @subsets orders
reference consumer[*] container : PurchaseOrder oppositeOf linkConsumer;
}
class PurchaseOrder extends WLinkEnd {
reference linkOrder: Supplier oppositeOf orders;
reference linkSupplier: Supplier oppositeOf supplier;
reference linkConsumer: Supplier oppositeOf consumer;
}
}