From: Rafael Kitover Date: Wed, 10 Feb 2010 17:09:28 +0000 (-0500) Subject: use "roles" when creating anon class for applying a role to instance X-Git-Tag: 0.98~5 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=a687ab448365b1a059b4d0b96e7e79419b116840;p=gitmo%2FMoose.git use "roles" when creating anon class for applying a role to instance --- diff --git a/lib/Moose/Meta/Role/Application/ToInstance.pm b/lib/Moose/Meta/Role/Application/ToInstance.pm index 5b5a5f1..f1e3d4e 100644 --- a/lib/Moose/Meta/Role/Application/ToInstance.pm +++ b/lib/Moose/Meta/Role/Application/ToInstance.pm @@ -29,11 +29,11 @@ sub apply { unless $obj_meta->isa('Moose::Meta::Class'); my $class = $obj_meta->create_anon_class( - superclasses => [ blessed($object) ], cache => 1, + superclasses => [ blessed($object) ], + roles => [ $role ], + cache => 1, ); - $self->SUPER::apply( $role, $class ); - $class->rebless_instance( $object, %{ $self->rebless_params } ); } diff --git a/t/100_bugs/028_apply_role_to_instance_only.t b/t/100_bugs/028_apply_role_to_instance_only.t new file mode 100644 index 0000000..be31007 --- /dev/null +++ b/t/100_bugs/028_apply_role_to_instance_only.t @@ -0,0 +1,44 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Test::More; +use Test::Exception; + +{ + package MyRole1; + use Moose::Role; + + sub a_role_method { 'foo' } +} + +{ + package MyRole2; + use Moose::Role; + # empty +} + +{ + package Foo; + use Moose; +} + +my $instance_with_role1 = Foo->new; +MyRole1->meta->apply($instance_with_role1); + +my $instance_with_role2 = Foo->new; +MyRole2->meta->apply($instance_with_role2); + +ok ((not $instance_with_role2->does('MyRole1')), + 'instance does not have the wrong role'); + +ok ((not $instance_with_role2->can('a_role_method')), + 'instance does not have methods from the wrong role'); + +ok (($instance_with_role1->does('MyRole1')), + 'role was applied to the correct instance'); + +lives_and { + is $instance_with_role1->a_role_method, 'foo' +} 'instance has correct role method'; + +done_testing;