Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
typed exception when trying to mix in non-composable types
  • Loading branch information
moritz committed May 27, 2012
1 parent 305e5ae commit 6555ab1
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
8 changes: 8 additions & 0 deletions src/core/Exception.pm
Expand Up @@ -714,6 +714,14 @@ my class X::Localizer::NoContainer is Exception {
}
}

my class X::Mixin::NonComposable is Exception {
has $.target;
has $.rolish;
method message() {
"Cannot mix in non-composable type {$.rolish.^name} into object of type {$.target.^name}";
}
}


{
my %c_ex;
Expand Down
10 changes: 5 additions & 5 deletions src/core/operators.pm
Expand Up @@ -12,14 +12,14 @@ 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");
X::Mixin::NonComposable.new(:target($obj), :$rolish).throw;
$obj.HOW.mixin($obj, $role).BUILD_LEAST_DERIVED({});
}
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");
X::Mixin::NonComposable.new(:target($obj), :$rolish).throw;
my @attrs = $role.^attributes().grep: { .has_accessor };
X::Role::Initialization.new().throw unless @attrs == 1;
$obj.HOW.mixin($obj, $role).BUILD_LEAST_DERIVED({ @attrs[0].Str.substr(2) => $value });
Expand All @@ -39,13 +39,13 @@ proto infix:<but>(|$) { * }
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");
X::Mixin::NonComposable.new(:target($obj), :$rolish).throw;
$obj.HOW.mixin($obj.clone(), $role).BUILD_LEAST_DERIVED({});
}
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");
X::Mixin::NonComposable.new(:target($obj), :$rolish).throw;
my @attrs = $role.^attributes().grep: { .has_accessor };
die(X::Role::Initialization.new())
unless @attrs == 1;
Expand All @@ -60,7 +60,7 @@ multi infix:<but>(Mu:D \$obj, Mu:U \$rolish, :$value! is parcel) {
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");
X::Mixin::NonComposable.new(:target($obj), :$rolish).throw;
$obj.HOW.mixin($obj, $role);
}
multi infix:<but>(Mu \$obj, Mu:D $val) is rw {
Expand Down

0 comments on commit 6555ab1

Please sign in to comment.