fix instance application not passing along role args (lsm)
Jesse Luehrs [Thu, 8 Apr 2010 23:35:11 +0000 (18:35 -0500)]
Changes
lib/Moose/Meta/Role.pm
lib/Moose/Meta/Role/Application/ToInstance.pm
t/100_bugs/029_instance_application_role_args.t [new file with mode: 0755]

diff --git a/Changes b/Changes
index 26cb1b3..778de2a 100644 (file)
--- a/Changes
+++ b/Changes
@@ -14,6 +14,8 @@ for, noteworthy changes.
     Moose tests with user that didn't have permission to write to the
     t/ directory. (Chris Weyl, Ævar Arnfjörð Bjarmason)
 
+  * Pass role arguments along when applying roles to instances. (doy, lsm)
+
 1.01 Fri, Mar 26, 2010
 
   [NEW FEATURES]
index 29d10fc..4e63f63 100644 (file)
@@ -399,7 +399,7 @@ sub alias_method {
 ## ------------------------------------------------------------------
 
 sub apply {
-    my ($self, $other, @args) = @_;
+    my ($self, $other, %args) = @_;
 
     (blessed($other))
         || Moose->throw_error("You must pass in an blessed instance");
@@ -416,7 +416,7 @@ sub apply {
     }
 
     Class::MOP::load_class($application_class);
-    return $application_class->new(@args)->apply($self, $other);
+    return $application_class->new(%args)->apply($self, $other, \%args);
 }
 
 sub composition_class_roles { }
index a54cb1a..d0d864e 100644 (file)
@@ -18,7 +18,7 @@ __PACKAGE__->meta->add_attribute('rebless_params' => (
 ));
 
 sub apply {
-    my ( $self, $role, $object ) = @_;
+    my ( $self, $role, $object, $args ) = @_;
 
     my $obj_meta = Class::MOP::class_of($object) || 'Moose::Meta::Class';
 
@@ -30,7 +30,7 @@ sub apply {
 
     my $class = $obj_meta->create_anon_class(
         superclasses => [ blessed($object) ],
-        roles => [ $role ],
+        roles => [ $role, keys(%$args) ? ($args) : () ],
         cache => 1,
     );
 
diff --git a/t/100_bugs/029_instance_application_role_args.t b/t/100_bugs/029_instance_application_role_args.t
new file mode 100755 (executable)
index 0000000..9c29a0e
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Test::More;
+use Test::Exception;
+
+{
+    package Point;
+    use Moose;
+
+    with qw/DoesNegated DoesTranspose/;
+
+    has x => ( isa => 'Int', is => 'rw' );
+    has y => ( isa => 'Int', is => 'rw' );
+
+    sub inspect { [$_[0]->x, $_[0]->y] }
+
+    no Moose;
+}
+
+{
+    package DoesNegated;
+    use Moose::Role;
+
+    sub negated {
+        my $self = shift;
+        $self->new( x => -$self->x, y => -$self->y );
+    }
+
+    no Moose::Role;
+}
+
+{
+    package DoesTranspose;
+    use Moose::Role;
+
+    sub transpose {
+        my $self = shift;
+        $self->new( x => $self->y, y => $self->x );
+    }
+
+    no Moose::Role;
+}
+
+my $p = Point->new( x => 4, y => 3 );
+
+DoesTranspose->meta->apply( $p, alias => { transpose => 'negated' } );
+
+is_deeply($p->negated->inspect, [3, 4]);
+is_deeply($p->transpose->inspect, [3, 4]);
+
+done_testing;