Documentation for routine does
Documentation for routine does, assembled from the following types:
sub infix:<does>(Mu , Mu ) is assoc<non>
$obj at run time. Requires
$obj to be mutable.
$role doesn't need to a be a role, it can be something that knows how to act like a role; e.g., enum values.
If methods of the same name are present already, the last mixed in role takes precedence.
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.
;does R2 ;;does R1 ;say [C ~~ R1, C ~~ R2];# OUTPUT: «[True True]␤»
method does(Mu --> Bool)
True if and only if the invocant conforms to type
my = Date.new('2016-06-03');say .does(Dateish); # True (Date does role Dateish)say .does(Any); # True (Date is a subclass of Any)say .does(DateTime); # False (Date is not a subclass of DateTime)
Using the smart match operator ~~ is a more idiomatic alternative.
my = Date.new('2016-06-03');say ~~ Dateish; # OUTPUT: «True␤»say ~~ Any; # OUTPUT: «True␤»say ~~ DateTime; # OUTPUT: «False␤»