Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Get does and but operators to handle turning non-composable types int…
…o composable ones, or dying helpfully.
  • Loading branch information
jnthn committed May 8, 2012
1 parent d2e01f1 commit 80416be
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions src/core/operators.pm
Expand Up @@ -8,12 +8,18 @@ sub infix:<=>(Mu \$a, Mu \$b) is rw {
}

proto infix:<does>(|$) { * }
multi infix:<does>(Mu:D \$obj, Mu:U \$role) is rw {
multi infix:<does>(Mu:D \$obj, Mu:U \$rolish) is rw {
# XXX Mutability check.
my $role := $rolish.HOW.archetypes.composable() ?? $rolish !!
$rolish.HOW.archetypes.composalizable() ?? $rolish.HOW.composalize($rolish) !!
die("Cannot mix in a non-composable type");
$obj.HOW.mixin($obj, $role).BUILD_LEAST_DERIVED({});
}
multi infix:<does>(Mu:D \$obj, Mu:U \$role, :$value! is parcel) is rw {
multi infix:<does>(Mu:D \$obj, Mu:U \$rolish, :$value! is parcel) is rw {
# XXX Mutability check.
my $role := $rolish.HOW.archetypes.composable() ?? $rolish !!
$rolish.HOW.archetypes.composalizable() ?? $rolish.HOW.composalize($rolish) !!
die("Cannot mix in a non-composable type");
my @attrs = $role.^attributes().grep: { .has_accessor };
die(X::Role::Initialization.new())
unless @attrs == 1;
Expand All @@ -31,16 +37,25 @@ multi infix:<does>(Mu:U \$obj, @roles) is rw {
}

proto infix:<but>(|$) { * }
multi infix:<but>(Mu:D \$obj, Mu:U \$role) {
multi infix:<but>(Mu:D \$obj, Mu:U \$rolish) {
my $role := $rolish.HOW.archetypes.composable() ?? $rolish !!
$rolish.HOW.archetypes.composalizable() ?? $rolish.HOW.composalize($rolish) !!
die("Cannot mix in a non-composable type");
$obj.HOW.mixin($obj.clone(), $role).BUILD_LEAST_DERIVED({});
}
multi infix:<but>(Mu:D \$obj, Mu:U \$role, :$value! is parcel) {
multi infix:<but>(Mu:D \$obj, Mu:U \$rolish, :$value! is parcel) {
my $role := $rolish.HOW.archetypes.composable() ?? $rolish !!
$rolish.HOW.archetypes.composalizable() ?? $rolish.HOW.composalize($rolish) !!
die("Cannot mix in a non-composable type");
my @attrs = $role.^attributes().grep: { .has_accessor };
die(X::Role::Initialization.new())
unless @attrs == 1;
$obj.HOW.mixin($obj.clone(), $role).BUILD_LEAST_DERIVED({ @attrs[0].Str.substr(2) => $value });
}
multi infix:<but>(Mu:U \$obj, Mu:U \$role) {
multi infix:<but>(Mu:U \$obj, Mu:U \$rolish) {
my $role := $rolish.HOW.archetypes.composable() ?? $rolish !!
$rolish.HOW.archetypes.composalizable() ?? $rolish.HOW.composalize($rolish) !!
die("Cannot mix in a non-composable type");
$obj.HOW.mixin($obj, $role);
}
multi infix:<but>(Mu \$obj, Mu:D $val) is rw {
Expand Down

0 comments on commit 80416be

Please sign in to comment.