X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FRole.pm;h=3789245ff5ef9317db9cb06358d7d36f4061c722;hb=c460adf158d4b2736a8fe137b84a44ccb6d0da94;hp=11e1b5972d52d945441e63ff46e6167513a918de;hpb=d27828133036cdd69923572453faad3920fd7c0e;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Role.pm b/lib/Moose/Meta/Role.pm index 11e1b59..3789245 100644 --- a/lib/Moose/Meta/Role.pm +++ b/lib/Moose/Meta/Role.pm @@ -9,7 +9,7 @@ use Scalar::Util 'blessed'; use Carp 'confess'; use Devel::GlobalDestruction 'in_global_destruction'; -our $VERSION = '1.14'; +our $VERSION = '1.15'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -18,6 +18,7 @@ use Moose::Meta::Role::Attribute; use Moose::Meta::Role::Method; use Moose::Meta::Role::Method::Required; use Moose::Meta::Role::Method::Conflicting; +use Moose::Meta::Method::Meta; use Moose::Util qw( ensure_all_roles ); use Class::MOP::MiniTrait; @@ -188,11 +189,25 @@ sub reinitialize { ); } - 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 { @@ -351,6 +366,7 @@ sub update_package_cache_flag { } +sub _meta_method_class { 'Moose::Meta::Method::Meta' } ## ------------------------------------------------------------------ ## subroles @@ -463,11 +479,15 @@ sub create { || confess "You must pass a HASH ref of methods" if exists $options{methods}; + $options{meta_name} = 'meta' + unless exists $options{meta_name}; + my (%initialize_options) = %options; delete @initialize_options{qw( package attributes methods + meta_name version authority )}; @@ -476,10 +496,8 @@ sub create { $meta->_instantiate_module( $options{version}, $options{authority} ); - # FIXME totally lame - $meta->add_method('meta' => sub { - $role->initialize(ref($_[0]) || $_[0]); - }); + $meta->_add_meta_method($options{meta_name}) + if defined $options{meta_name}; if (exists $options{attributes}) { foreach my $attribute_name (keys %{$options{attributes}}) {