X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FUtil%2FMetaRole.pm;h=5cb451b2f05b4103a040d6996cfade8edf9b896e;hb=95f64261533cb53bdaade56d3b50a8fa9fb7dcd3;hp=c8053fd51cc2afd9540a6f98b791af55e61d39f8;hpb=b2ad68e3fbe4016e354980a636c1ed39e941162a;p=gitmo%2FMoose.git diff --git a/lib/Moose/Util/MetaRole.pm b/lib/Moose/Util/MetaRole.pm index c8053fd..5cb451b 100644 --- a/lib/Moose/Util/MetaRole.pm +++ b/lib/Moose/Util/MetaRole.pm @@ -3,7 +3,7 @@ package Moose::Util::MetaRole; use strict; use warnings; -our $VERSION = '0.67'; +our $VERSION = '0.73'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -16,8 +16,9 @@ sub apply_metaclass_roles { my $for = $options{for_class}; - my %old_classes - = map { $_ => $for->meta->$_ } grep { $for->meta->can($_) } @Classes; + my %old_classes = map { $_ => Class::MOP::class_of($for)->$_ } + grep { Class::MOP::class_of($for)->can($_) } + @Classes; my $meta = _make_new_metaclass( $for, \%options ); @@ -42,19 +43,19 @@ sub _make_new_metaclass { my $for = shift; my $options = shift; - return $for->meta() + return Class::MOP::class_of($for) unless grep { exists $options->{ $_ . '_roles' } } qw( metaclass attribute_metaclass method_metaclass + wrapped_method_metaclass instance_metaclass ); + my $old_meta = Class::MOP::class_of($for); my $new_metaclass - = _make_new_class( ref $for->meta(), $options->{metaclass_roles} ); - - my $old_meta = $for->meta(); + = _make_new_class( ref $old_meta, $options->{metaclass_roles} ); # This could get called for a Moose::Meta::Role as well as a Moose::Meta::Class my %classes = map { @@ -64,6 +65,7 @@ sub _make_new_metaclass { qw( attribute_metaclass method_metaclass + wrapped_method_metaclass instance_metaclass ); @@ -75,7 +77,7 @@ sub apply_base_class_roles { my $for = $options{for_class}; - my $meta = $for->meta(); + my $meta = Class::MOP::class_of($for); my $new_base = _make_new_class( $for, @@ -123,7 +125,7 @@ Moose::Util::MetaRole - Apply roles to any metaclass, as well as the object base use Moose (); use Moose::Exporter; - use Moose::Util::Meta::Role; + use Moose::Util::MetaRole; use MyApp::Role::Meta::Class; use MyApp::Role::Meta::Method::Constructor; @@ -199,6 +201,8 @@ This specifies the class for which to alter the meta classes. =item * method_metaclass_roles => \@roles +=item * wrapped_method_metaclass_roles => \@roles + =item * instance_metaclass_roles => \@roles =item * constructor_class_roles => \@roles @@ -215,44 +219,6 @@ once. This function will apply the specified roles to the object's base class. -=head1 PROBLEMS WITH METACLASS ROLES AND SUBCLASS - -Because of the way this module works, there is an ordering problem -which occurs in certain situations. This sequence of events causes an -error: - -=over 4 - -=item 1. - -There is a class (ClassA) which uses some extension(s) that apply -roles to the metaclass. - -=item 2. - -You have another class (ClassB) which wants to subclass ClassA and -apply some more extensions. - -=back - -Normally, the call to C will happen at run time, I the -additional extensions are applied. This causes an error when we try to -make the metaclass for ClassB compatible with the metaclass for -ClassA. - -We hope to be able to fix this in the future. - -For now the workaround is for ClassB to make sure it extends ClassA -I it loads extensions: - - package ClassB; - - use Moose; - - BEGIN { extends 'ClassA' } - - use MooseX::SomeExtension; - =head1 AUTHOR Dave Rolsky Eautarch@urth.orgE