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)
}