use Carp 'confess';
use Devel::GlobalDestruction 'in_global_destruction';
-our $VERSION = '1.03';
+our $VERSION = '1.14';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
use Moose::Meta::Role::Method::Required;
use Moose::Meta::Role::Method::Conflicting;
use Moose::Util qw( ensure_all_roles );
+use Class::MOP::MiniTrait;
use base 'Class::MOP::Module',
'Class::MOP::Mixin::HasAttributes',
'Class::MOP::Mixin::HasMethods';
+Class::MOP::MiniTrait::apply(__PACKAGE__, 'Moose::Meta::Object::Trait');
+
## ------------------------------------------------------------------
## NOTE:
## I normally don't do this, but I am doing
);
}
- return $self->SUPER::reinitialize(
+ # don't need to remove generated metaobjects here yet, since we don't
+ # yet generate anything in roles. this may change in the future though...
+ # keep an eye on that
+ my $new_meta = $self->SUPER::reinitialize(
$pkg,
%existing_classes,
@_,
);
+ $new_meta->_restore_metaobjects_from($meta)
+ if $meta && $meta->isa('Moose::Meta::Role');
+ return $new_meta;
+}
+
+sub _restore_metaobjects_from {
+ my $self = shift;
+ my ($old_meta) = @_;
+
+ $self->_restore_metamethods_from($old_meta);
+ $self->_restore_metaattributes_from($old_meta);
}
sub add_attribute {
my $class = ref $_[0];
Moose->throw_error( "Cannot add a $class as an attribute to a role" );
}
- elsif (!blessed($_[0]) && $_[0] =~ /^\+(.*)/) {
+ elsif (!blessed($_[0]) && defined($_[0]) && $_[0] =~ /^\+(.*)/) {
Moose->throw_error( "has '+attr' is not supported in roles" );
}
sub find_method_by_name { (shift)->get_method(@_) }
-sub alias_method {
- Carp::cluck("The alias_method method is deprecated. Use add_method instead.\n");
-
- my $self = shift;
-
- $self->add_method(@_);
-}
-
## ------------------------------------------------------------------
## role construction
## ------------------------------------------------------------------
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