Moose::Meta::Role::create should honor "roles"
Chris Weyl [Fri, 22 Apr 2011 03:12:19 +0000 (20:12 -0700)]
Moose::Meta::Role's docs claim create() is "identical" to the create() in
Moose::Meta::Class, yet it currently does not honor "roles" if passed to it.

This commit fixes that by having  Moose::Meta::Role::create() honor a roles
named parameter, and adds tests to validate/ensure that behaviour.

lib/Moose/Meta/Role.pm
t/roles/create_role.t

index 2ee6d1f..33f6347 100644 (file)
@@ -522,7 +522,12 @@ sub create {
         || confess "You must pass a HASH ref of methods"
             if exists $options{methods};
 
+    (ref $options{roles} eq 'ARRAY')
+        || $class->throw_error("You must pass an ARRAY ref of roles", data => $options{roles})
+            if exists $options{roles};
+
     my $package      = delete $options{package};
+    my $roles        = delete $options{roles};
     my $attributes   = delete $options{attributes};
     my $methods      = delete $options{methods};
     my $meta_name    = exists $options{meta_name}
@@ -548,6 +553,10 @@ sub create {
         }
     }
 
+    if ($roles) {
+        Moose::Util::apply_all_roles($meta, @$roles);
+    }
+
     return $meta;
 }
 
index 204c66d..3963dd1 100644 (file)
@@ -30,4 +30,11 @@ ok(!$visored->is_worn, "method was consumed");
 
 ok(!$role->is_anon_role, "the role is not anonymous");
 
+my $composed_role = Moose::Meta::Role->create(
+    'MyItem::Role::Equipment2',
+    roles => [ $role ],
+);
+
+ok($composed_role->does_role('MyItem::Role::Equipment2'), "Role composed into role");
+
 done_testing;