also don't close over member tc objects in native delegations
[gitmo/Moose.git] / lib / Moose / Util.pm
index 0dee288..469e281 100644 (file)
@@ -10,9 +10,7 @@ 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 Class::MOP;
 
 my @exports = qw[
     find_meta
@@ -98,7 +96,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) {
@@ -307,7 +316,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;