use warnings;
use metaclass;
+use List::MoreUtils 'firstval';
use Moose::Util 'english_list';
use Scalar::Util 'weaken', 'blessed';
__PACKAGE__->meta->add_attribute('role' => (
reader => 'role',
+ Class::MOP::_definition_context(),
));
__PACKAGE__->meta->add_attribute('class' => (
accessor => 'class',
+ Class::MOP::_definition_context(),
));
sub apply {
my ($self, $role, $class) = @_;
+ # We're not checking for role names to support multiple instances of the
+ # same Parameterized role.
+ return if grep { $role == $_ } @{ $class->roles() };
+
# We need weak_ref in CMOP :(
weaken($self->{role} = $role);
weaken($self->{class} = $class);
. "' requires the $noun $list "
. "to be implemented by '"
. $class->name . q{'};
+
+ if (my $meth = firstval { $class->name->can($_) } @missing) {
+ $error .= ". If you imported functions intending to use them as "
+ . "methods, you need to explicitly mark them as such, via "
+ . $class->name . "->meta->add_method($meth => \\\&$meth)";
+ }
}
$class->throw_error($error);
sub apply_attributes {
my ($self, $role, $class) = @_;
- my $attr_metaclass = $role->applied_attribute_metaclass;
foreach my $attribute_name ($role->get_attribute_list) {
# it if it has one already
}
else {
$class->add_attribute(
- $role->get_attribute($attribute_name)->attribute_for_class($attr_metaclass)
+ $role->get_attribute($attribute_name)->attribute_for_class
);
}
}