FM3 or Fame meta-metamodel is a model to describe metamodels.

  • FM3 is self-described in itself.
  • FM3 is a superset of a subset of EMOF.
  • FM3 is small and simple.
  • FM3 is extendable.

FM3 applies lessons learned and best practices from using EMOF in the Moose and Famix project:

  • FM3 allows packages to weave methods into existing classes of other packages. Using this, Famix extensions may extend the core specification of the model.
  • FM3 is EMOF reduced to the max. We removed anything that was not used by Famix. For example, EMOF specifies multiplicity of properties using lower: Integer and upper: Unlimited. As upper may possibly be unlimited, EMOF even introduces Unlimited as core primitive type, messing up any implementation. Analysis of existing models showed however that we use 0..1 and 0..* only! Hence, FM3 models multiplicity of properties using multivalued: Boolean, simple and no need for fancy primitives.

See also:


is an abstract class with attributes

  • Element owner (derived)
  • String fullName (derived)
  • String name

with these constraints

  • name must be alphanumeric
  • fullName is dervied recursively, concatenating owner.fullName and name
  • fullName is seperated by dots, eg FAMIX.Class.allAttributes


subclasses NamedElement with attributes

  • Boolean abstract
  • Boolean primitive (derived)
  • Boolean root (derived)
  • Class superclass
  • Package package (container, opposite Package.classes)
  • Property allAttributes (derived, multivalued)
  • Property attributes (multivalued, opposite Property.class)

with these reserved instances

 OBJECT := (FM3.Class (name 'Object') (root true))
 BOOLEAN := (FM3.Class (name 'Boolean') (primitive true) (superclass (ref: Object)))
 NUMBER := (FM3.Class (name 'Number') (primitive true) (superclass (ref: Object)))
 STRING := (FM3.Class (name 'String') (primitive true) (superclass (ref: Object)))

for any other instance of MF3.Class, these constraints apply

  • owner is derived from package
  • superclass is not nil
  • superclass must not be a primitive
  • superclass chain may not include cycles
  • package must not be nil
  • allAttributes is derived as union of attributes and superclass.allAttributes
  • only one of allAttributes may have container = true
  • allAttributes must have unique names
  • in particular, none of attributes may have the name of any of superclass.allAttributes

// TODO, I am not sure about this ... it does not allow overloading of attributes, does anyone need overloading?


subclasses NamedElement with attributes

  • Class classes (multivalued, opposite Class.package)
  • Property extensions (multivalued, opposite Property.package)

with these constraints

  • owner is nil
  • classes must have unique names
  • for each element of extentions, it class is not in classes


subclasses NamedElement with attributes

  • Boolean composite (derived)
  • Boolean container
  • Boolean derived
  • Boolean multivalued
  • Class class (container, opposite Class.attributes)
  • Class type
  • Package package (opposite Package.extensions)
  • Property opposite (opposite Property.opposite)

with these constraints

  • owner is derived from class
  • composite is derived from opposite.container
  • container implies not multivalued
  • if set, opposite.opposite must be self
  • if set, opposite.class must be type
  • class must not be nil
  • type must not be nil

and these semantics

  • container property chains may not include cycles
  • opposite properties must refer to each other
  • any multivalued property defaults to empty
  • boolean properties default to false
  • non primitive properties default to null
  • string and number properties not have a default value // TODO is this wise?
Last changed by admin on 21 April 2009