Roles are another mechanism in modern OOP. A role is like an external part of the class, which is appended to an existing object or a class, providing some extra attributes and methods. Roles are very close to interfaces in some programming languages.
Let us take a house and make it a floating house. For simplicity, the House class has only one attribute, the area of the house. The Floating role has an attribute that keeps the weight of the floating house and the method that returns a Boolean value if the house is too heavy and is sinking:
class House {
has $.area is rw;
}
role Floating {
has $.weight is rw;
method is_sinking() {
return $!weight > 500 * $.area;
}
}
Syntactically, the only difference in creating a role is the keyword role in place of the class keyword.
From now on, there are two ways of applying a role...