// This example refers to Figures 2, 4, 5 and 6 of 'The Dagstuhl Middle Metamodel: 
// A Schema for Reverse Engineering', ATEM 2003, First International 
// Workshop on Meta-Models and Schemas for Reverse Engineering, 
// WCRE, Victoria, B.C., in Electronic Notes in Theoretical Computer
// Science, Elsevier, Vol. 94, pp 7-18,
// Authors: Lethbridge, T.C., Sander Tichelaar, and Erhard Ploedereder (2003) 

// To load the entire DMM example at once, copy and paste all 
// five DMM components (DMM*) into the editor.  Please note that the
// position attributes of classes and associations will need to be 
// re-adjusted, as the example has been made to display the diagrams 
// as separate entities.

class ModelElement{
  visibility;
}

class StructuralElement{
  isA ModelElement;
}

class BehaviouralElement{
  isA ModelElement;
}

class Invokes{
  * invoked -- 1 BehaviouralElement invokes;
  * invokes -- 1 BehaviouralElement invoked;
}

class Accesses{
  * -- 1 BehaviouralElement;
  * -- 1 StructuralElement;
}

class Package{
  isA ModelElement;
  * -- 0..1 Package isSubpackageOf;
}

class Contains{
  * contains -- 1 Package partOf;
  0..1 -- 1 ModelElement;
}

class Type{
  isA StructuralElement;
}

class IsDefinedInTermsOf{
  * definesBy -- 1 Type definedBy;
  * definedBy -- 1 Type definesBy;
}

class Value{
  isA StructuralElement;
}

class IsOfType{
  0..1 -- 1 Value;
  * -- 1 Type;
}

class EnumerationLiteral{
  isA Value;
}

class IsEnumerationLiteralOf{
  1..* -- 1 EnumerationLiteral;
  * -- 1 EnumeratedType;
}

class Variable{
  isA Value;
  0..1 -- 0..1 Value hasValue;
}

class Property{
  isA Variable;
  1 -- 1 MethodInProperty;
}

class MethodInProperty{
  isA Method;
}

class EnumeratedType{
  isA Type;
}

class CollectionType{
  isA Type;
  size;
}

class StructuredType{
  isA Type;
}

class Field{
  isA Variable;
}

class IsFieldOf{
  1 -- 1 Field;
  * -- 1 StructuredType;
}

class FormalParameter{
  isA Variable;
  pos;
}

class IsParameterOf{
  1 -- 1 FormalParameter;
  * -- 1 BehaviouralElement;
}

class Class{
  isA StructuredType;
  isSubclassable;
}

class InheritsFrom{
  1 transmits -- * Class inherits;
  1 inherits -- * Class transmits;
}

class Imports{
  * -- 1 Package;
  * -- 1 Class;
}

class ExecutableValue{
  isA BehaviouralElement;
}

class Method{
  isA BehaviouralElement;
  Boolean isConstructor;
  Boolean isDestructor;
  Boolean isAbstract;
  Boolean isDynamicallyBound;
  Boolean isOverideable;
}

class IsMethodOf{
  * -- 1 Class methodOf;
  0..1 -- 1 Method hasMethod;
}

class Routine{
  isA BehaviouralElement;
}
//$?[End_of_model]$?
//Positioning
class Method
{
  position 678 455 216 128;
}

class Class
{
  position 21 527 172 56;
}

class ModelElement
{
  position 359 11 129 58;
}

class FormalParameter
{
  position 546 457 109 58;
}

class CollectionType
{
  position 119 312 109 58;
}

class BehaviouralElement
{
  position 720 119 117 60;
}

class EnumerationLiteral
{
  position 364 332 131 41;
}

class Routine
{
  position 666 329 109 41;
}

class ExecutableValue
{
  position 803 330 131 46;
}

class Field
{
  position 318 457 109 41;
}

class StructuredType
{
  position 52 384 109 41;
}

class EnumeratedType
{
  position 188 381 109 41;
}

class Variable
{
  position 506 331 109 41;
  position.association 0 79,0 106,41;
}

class Value
{
  position 479 204 109 41;
}

class Type
{
  position 152 204 109 60;
}

class Package
{
  position 28 113 108 60;
}

class StructuralElement
{
  position 318 126 133 41;
}

class Property
{
  position 432 457 109 41;
  position.association 0 55,41 0,20;
}

// Association classes
class Accesses
{
  position 508 127 109 41;
  position.association 0 109,10 0,18;
  position.association 1 0,10 133,11;
}

class Invokes
{
  position 800 17 109 41;
  position.association 0 4,41 84,0;
  position.association 1 26,41 106,0;
}

class Contains
{
  position 24 14 109 41;
  position.association 0 24,41 20,0;
  position.association 1 109,23 0,26;
}

class IsOfType
{
  position 295 205 109 41;
  position.association 0 109,10 0,11;
  position.association 1 0,4 109,56;
}

class Imports
{
  position 6 226 109 41;
  position.association 0 62,0 40,60;
  position.association 1 26,41 11,0;

}

class IsDefinedInTermsOf
{
  position 154 110 135 41;
  position.association 0 38,41 40,0;
  position.association 1 10,41 12,0;
}

class IsParameterOf
{
  position 603 203 109 41;
  position.association 0 70,0 0,56.5;
  position.association 1 70,0 0,60;
}

class IsEnumerationLiteralOf
{
  position 260 269 135 41;
  position.association 0 90,41 0,30;
  position.association 1 28,41 100,0;
}

class IsFieldOf
{
  position 141 477 109 41;
  position.association 0 109,10 0,30;
  position.association 1 10,0 99,41;
}

class IsMethodOf
{
  position 363 551 109 41;
  position.association 0 0,10 172,34;
  position.association 1 109,10 0,106;
}

class InheritsFrom
{
  position 50 610 109 41;
  position.association 0 0,30 0,56;
  position.association 1 109,30 172,56;
}

class MethodInProperty
{
  position 740 630 132 49;
}

class Student
{
}

class Mentor
{
}

class Mentor
{
  position 60 160 109 41;
}

class Student
{
  position 100 100 109 41;
}

class Student
{
}

class Student
{
  position 60 60 109 41;
}

class Mentor
{
}

class Mentor
{
  position 60 160 109 41;
}


class Student
{
}

class Mentor
{
}

class Course
{
}

class Student
{
  position 60 60 109 41;
}

class Mentor
{
  position 60 160 109 41;
}

class Course
{
  position 60 260 109 41;
}

class Student
{
}

class Student
{
  position 138 153 109 41;
}

class A
{
  class B
  {
  }
}

class A
{
  position 60 60 109 41;
}

class B
{
  position 60 160 109 41;
}

class A
{
  class B
  {
  }
}

class B
{
  position 60 160 109 41;
}

class A
{
  position 60 60 109 41;
}

class Student
{
}

class Student
{
  name;
}

class Student
{
  position 50 30 109 41;
}

class A
{
  class B
  {
  }
}

class A
{
  position 60 60 109 41;
}

class B
{
  position 60 160 109 41;
}

class Student
{
}

class Mentor
{
}

associationClass Course
{
  * Student;
  * Mentor;  
}

class Student
{
  position 50 30 109 41;
}

class Mentor
{
  position 50 130 109 41;
}

class Course
{
  position 50 230 109 41;
}

class Student
{
}

class Mentor
{
}

associationClass Course
{
  * Student;
  * Mentor;
}

class Student
{
  position 50 30 109 41;
}

class Mentor
{
  position 50 130 109 41;
}

class Course
{
  position 50 230 109 41;
}