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 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 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␤»