use Carp 'confess';
use Devel::GlobalDestruction 'in_global_destruction';
-our $VERSION = '0.93_03';
+our $VERSION = '1.05';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
use Moose::Meta::Role::Method::Conflicting;
use Moose::Util qw( ensure_all_roles );
-use base 'Class::MOP::Module', 'Class::MOP::Mixin::HasAttributes';
+use base 'Class::MOP::Module',
+ 'Class::MOP::Mixin::HasAttributes',
+ 'Class::MOP::Mixin::HasMethods';
## ------------------------------------------------------------------
## NOTE:
my $class = ref $_[0];
Moose->throw_error( "Cannot add a $class as an attribute to a role" );
}
+ elsif (!blessed($_[0]) && defined($_[0]) && $_[0] =~ /^\+(.*)/) {
+ Moose->throw_error( "has '+attr' is not supported in roles" );
+ }
return $self->SUPER::add_attribute(@_);
}
## ------------------------------------------------------------------
sub apply {
- my ($self, $other, @args) = @_;
+ my ($self, $other, %args) = @_;
(blessed($other))
|| Moose->throw_error("You must pass in an blessed instance");
}
Class::MOP::load_class($application_class);
- return $application_class->new(@args)->apply($self, $other);
+ return $application_class->new(%args)->apply($self, $other, \%args);
}
sub composition_class_roles { }
return $meta;
}
+sub consumers {
+ my $self = shift;
+ my @consumers;
+ for my $meta (Class::MOP::get_all_metaclass_instances) {
+ next if $meta->name eq $self->name;
+ next unless $meta->isa('Moose::Meta::Class')
+ || $meta->isa('Moose::Meta::Role');
+ push @consumers, $meta->name
+ if $meta->does_role($self->name);
+ }
+ return @consumers;
+}
+
# anonymous roles. most of it is copied straight out of Class::MOP::Class.
# an intrepid hacker might find great riches if he unifies this code with that
# code in Class::MOP::Module or Class::MOP::Package
Returns true if the role is an anonymous role.
+=item B<< $metarole->consumers >>
+
+Returns a list of names of classes and roles which consume this role.
+
=back
=head2 Role application
=head2 Method modifiers
-These methods act like their counterparts in L<Class::Mop::Class> and
+These methods act like their counterparts in L<Class::MOP::Class> and
L<Moose::Meta::Class>.
However, method modifiers are simply stored internally, and are not