diff --git a/build/Makefile.in b/build/Makefile.in index edfb97c65c0..902343e9cf2 100644 --- a/build/Makefile.in +++ b/build/Makefile.in @@ -91,6 +91,7 @@ BUILTINS_PIR = \ src/metamodel/GrammarHOW.pir \ src/builtins/Any.pir \ src/builtins/Role.pir \ + src/builtins/ConcreteRole.pir \ src/builtins/Abstraction.pir \ src/builtins/Positional.pir \ src/builtins/Iterable.pir \ diff --git a/src/builtins/ConcreteRole.pir b/src/builtins/ConcreteRole.pir new file mode 100644 index 00000000000..337fce266f3 --- /dev/null +++ b/src/builtins/ConcreteRole.pir @@ -0,0 +1,41 @@ +## $Id$ + +=head1 NAME + +src/classes/ConcreteRole.pir - methods for the ConcreteRole class + +=head1 Description + +A concrete role is a role that has been selected from an abstract role by +providing a (possibly empty) set of role parameters. This class for now +is primarily just designed to know how to match one of them in a multiple +dispatch. + +=head1 Methods + +=over 4 + +=cut + +.namespace ['ConcreteRole'] + +.sub 'onload' :anon :init :load + .local pmc p6meta, proto + p6meta = get_hll_global ['Mu'], '$!P6META' + proto = p6meta.'new_class'('ConcreteRole', 'parent'=>'Any') +.end + +.sub 'PROTOOVERRIDES' :method + .return ('new', 'ACCEPTS') +.end + +.sub 'ACCEPTS' :method + .param pmc topic + $I0 = isa topic, 'P6role' + $P0 = '&prefix:'($I0) + .return ($P0) +.end + +=back + +=cut diff --git a/src/core/operators.pm b/src/core/operators.pm index e0cb02f7a82..cf2a3f72cc2 100644 --- a/src/core/operators.pm +++ b/src/core/operators.pm @@ -93,8 +93,11 @@ our sub undefine(Mu \$x) { } our multi infix:(Mu \$do-it-to-me, Role $r) { - my $specific_role = $r!select; - my $applicator = $specific_role.^applier_for($do-it-to-me); + &infix:($do-it-to-me, $r!select) +} + +our multi infix:(Mu \$do-it-to-me, ConcreteRole $r) { + my $applicator = $r.^applier_for($do-it-to-me); $applicator.apply($do-it-to-me, [$r]); $do-it-to-me }