Combined from primary sources listed below.
See primary docmentation in context for routine does.
method does(Mu $type --> Bool:D)
Returns True if and only if the invocant conforms to type $type.
my $d = Date.new('2016-06-03');
say $d.does(Dateish); # OUTPUT: «True» (Date does role Dateish)
say $d.does(Any); # OUTPUT: «True» (Date is a subclass of Any)
say $d.does(DateTime); # OUTPUT: «False» (Date is not a subclass of DateTime)
Unlike isa, which returns True only for superclasses, does includes both superclasses and roles.
say $d.isa(Dateish); # OUTPUT: «False»
Using the smartmatch operator ~~ is a more idiomatic alternative.
my $d = Date.new('2016-06-03');
say $d ~~ Dateish; # OUTPUT: «True»
say $d ~~ Any; # OUTPUT: «True»
say $d ~~ DateTime; # OUTPUT: «False»
See primary docmentation in context for trait does.
The trait does can be applied to roles and classes providing compile time mixins. To refer to a role that is not defined yet, use a forward declaration. The type name of the class with mixed in roles does not reflect the mixin, a type check does. If methods are provided in more than one mixed in role, the method that is defined first takes precedence. A list of roles separated by comma can be provided. In this case conflicts will be reported at compile time.
role R2 {...};
role R1 does R2 {};
role R2 {};
class C does R1 {};
say [C ~~ R1, C ~~ R2];
# OUTPUT: «[True True]»
See primary docmentation in context for sub does.
multi does-ok(Mu $var, Mu $type, $desc = "...")
Marks a test as passed if the given $var can do the given role $type. The function accepts an optional description of the test.
# create a Womble who can invent
role Invent {
method brainstorm { say "Aha!" }
}
class Womble {}
class Tobermory is Womble does Invent {}
# ... and later in the tests
use Test;
my $tobermory = Tobermory.new;
# with automatically generated test description
does-ok $tobermory, Invent;
# => The object does role Type
does-ok $tobermory, Invent, "Tobermory can invent";
# => Tobermory can invent