X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FUtil.pm;h=63a4da53e3b5d8c81a3df71915c1aa5e1c1661fd;hb=7605e87a6728e38c0b532430958bb52efb8139ff;hp=0dee28805fb613d3920d9d42bb40daa6c355e079;hpb=ad46f5244f59757c45306c4a41e195b7aa4b0943;p=gitmo%2FMoose.git diff --git a/lib/Moose/Util.pm b/lib/Moose/Util.pm index 0dee288..63a4da5 100644 --- a/lib/Moose/Util.pm +++ b/lib/Moose/Util.pm @@ -10,9 +10,8 @@ use Scalar::Util 'blessed'; use List::Util qw(first); use List::MoreUtils qw(any all); use overload (); -use Class::MOP 0.60; - -our $AUTHORITY = 'cpan:STEVAN'; +use Try::Tiny; +use Class::MOP; my @exports = qw[ find_meta @@ -45,6 +44,10 @@ sub find_meta { Class::MOP::class_of(@_) } sub does_role { my ($class_or_obj, $role) = @_; + if (try { $class_or_obj->isa('Moose::Object') }) { + return $class_or_obj->does($role); + } + my $meta = find_meta($class_or_obj); return unless defined $meta; @@ -98,7 +101,18 @@ sub _apply_all_roles { Moose->throw_error("Must specify at least one role to apply to $applicant"); } - my $roles = Data::OptList::mkopt( [@_] ); + # If @_ contains role meta objects, mkopt will think that they're values, + # because they're references. In other words (roleobj1, roleobj2, + # roleobj3) will become [ [ roleobj1, roleobj2 ], [ roleobj3, undef ] ] + # -- this is no good. We'll preprocess @_ first to eliminate the potential + # bug. + # -- rjbs, 2011-04-08 + my $roles = Data::OptList::mkopt( [@_], { + moniker => 'role', + name_test => sub { + ! ref $_[0] or blessed($_[0]) && $_[0]->isa('Moose::Meta::Role') + } + }); my @role_metas; foreach my $role (@$roles) { @@ -109,7 +123,7 @@ sub _apply_all_roles { } else { Class::MOP::load_class( $role->[0] , $role->[1] ); - $meta = Class::MOP::class_of( $role->[0] ); + $meta = find_meta( $role->[0] ); } unless ($meta && $meta->isa('Moose::Meta::Role') ) { @@ -128,7 +142,11 @@ sub _apply_all_roles { return unless @role_metas; - my $meta = ( blessed $applicant ? $applicant : find_meta($applicant) ); + Class::MOP::load_class($applicant) + unless blessed($applicant) + || Class::MOP::class_of($applicant); + + my $meta = ( blessed $applicant ? $applicant : Moose::Meta::Class->initialize($applicant) ); if ( scalar @role_metas == 1 ) { my ( $role, $params ) = @{ $role_metas[0] }; @@ -307,7 +325,7 @@ sub _reconcile_roles_for_metaclass { # handle the case where we need to fix compatibility between a class and # its parent, but all roles in the class are already also done by the # parent - # see t/050/054.t + # see t/metaclasses/metaclass_compat_no_fixing_bug.t return $super_meta_name unless @role_differences;