Rules

Rules are basically the same as functions. They can have a context type, which is a metamodel type. They may also have a return type (typically a base type (String, Boolean, Integer), and input parameters. The body of a rule contains a set of statements.

uml.Package::mapPackage () {
  self.ownedMember->forEach(c:uml.Class)
     c.mapClass()
}

uml.Class::mapClass(){
    file (package_dir + self.name + ext)
    self.classPackage()
    self.standardClassImport ()
    self.standardClassHeaderComment ()

    <%
    public class %>
self.name <% extends Serializable { %>
       self.classConstructor()
       <%    
       /*
       * Attributes
       */
    %>

       self.ownedAttribute->forEach(p : uml.Property) {
              p.classPrivateAttribute()
       }
       newline(2)
   <%}%>
}

A rule may also return a value, which can be reused in expressions in other rules. To return a value, the result statement is used.

uml.Package::getFullName (): String {
  if (self.owner != null)
    result = self.owner.getFullName() + "."
  else if (self.ownerPackage != null)
    result = self.ownerPackage.getFullName() + "."
  result += self.name.toLower().replace(" ", "_"); 
}

A rule may have any number of parameters. A parameter can be of a built-in type or a metamodel type.

uml.Model::testParameters2 (s1:String, i1:Integer) {
  stdout.println("testParameters2: " + s1 + ", " + i1)
}
 

uml.Model::testParameters3 (s1:String, r2:Real, b1:Boolean, package:uml.Package) {
  stdout.println("Package:" + package.name)
  stdout.println ("testParameters3: " + s1 + ", " + r2 + ", " + b1 + " " + package.name)
}