use warnings;
use metaclass;
+use List::MoreUtils 'firstval';
use Moose::Util 'english_list';
use Scalar::Util 'weaken', 'blessed';
-our $VERSION = '1.18';
-$VERSION = eval $VERSION;
-our $AUTHORITY = 'cpan:STEVAN';
-
use base 'Moose::Meta::Role::Application';
__PACKAGE__->meta->add_attribute('role' => (
reader => 'role',
+ Class::MOP::_definition_context(),
));
__PACKAGE__->meta->add_attribute('class' => (
- reader => '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 = $class->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
);
}
}
1;
+# ABSTRACT: Compose a role into a class
+
__END__
=pod
-=head1 NAME
-
-Moose::Meta::Role::Application::ToClass - Compose a role into a class
-
=head1 DESCRIPTION
=head2 METHODS
See L<Moose/BUGS> for details on reporting bugs.
-=head1 AUTHOR
-
-Stevan Little E<lt>stevan@iinteractive.comE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2010 by Infinity Interactive, Inc.
-
-L<http://www.iinteractive.com>
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
=cut