In Operators§

See primary documentation in context for infix does

sub infix:<does>(Mu $objMu $roleis assoc<non>

Mixes $role into $obj at runtime. Requires $obj to be mutable.

Similar to but operator, if $role supplies exactly one attribute, an initializer can be passed in parentheses.

Similar to but operator, the $role can instead be an instantiated object, in which case, the operator will create a role for you automatically. The role will contain a single method named the same as $obj.^name and that returns $obj:

my $o = class { method Str { "original" } }.new;
put $o;            # OUTPUT: «original␤» 
$o does "modded";
put $o;            # OUTPUT: «modded␤»

If methods of the same name are present already, the last mixed in role takes precedence.

In Type system§

See primary documentation 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 ~~ R1C ~~ R2];
# OUTPUT: «[True True]␤»

For runtime mixins see but and does.

In Mu§

See primary documentation 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␤»