From: Hans Dieter Pearcey Date: Thu, 25 Jun 2009 18:39:26 +0000 (-0400) Subject: add curried_arguments, usable from hashref handles X-Git-Tag: 0.89_02~138^2~1^2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2de18801c55ae2cfac72d6697e797f3875286d83;p=gitmo%2FMoose.git add curried_arguments, usable from hashref handles --- diff --git a/lib/Moose/Meta/Attribute.pm b/lib/Moose/Meta/Attribute.pm index 81bdb2c..bf599be 100644 --- a/lib/Moose/Meta/Attribute.pm +++ b/lib/Moose/Meta/Attribute.pm @@ -691,11 +691,17 @@ sub _make_delegation_method { $method_body = $method_to_call if 'CODE' eq ref($method_to_call); + my $curried_arguments = []; + + ($method_to_call, $curried_arguments) = @$method_to_call + if 'ARRAY' eq ref($method_to_call); + return $self->delegation_metaclass->new( name => $handle_name, package_name => $self->associated_class->name, attribute => $self, delegate_to_method => $method_to_call, + curried_arguments => $curried_arguments, ); } diff --git a/lib/Moose/Meta/Method/Delegation.pm b/lib/Moose/Meta/Method/Delegation.pm index 15c6d21..2fadd19 100644 --- a/lib/Moose/Meta/Method/Delegation.pm +++ b/lib/Moose/Meta/Method/Delegation.pm @@ -36,6 +36,14 @@ sub new { || confess 'You must supply a delegate_to_method which is a method name or a CODE reference'; + ( !exists $options{curried_arguments} || ( + $options{curried_arguments} && + ( 'ARRAY' eq ref $options{curried_arguments} ) + ) ) || confess + 'You must supply a curried_arguments which is an ARRAY reference'; + + $options{curried_arguments} ||= []; + my $self = $class->_new( \%options ); weaken( $self->{'attribute'} ); @@ -52,6 +60,8 @@ sub _new { return bless $options, $class; } +sub curried_arguments { (shift)->{'curried_arguments'} } + sub associated_attribute { (shift)->{'attribute'} } sub delegate_to_method { (shift)->{'delegate_to_method'} } @@ -88,7 +98,8 @@ sub _initialize_body { method_name => $method_to_call, object => $instance ); - $proxy->$method_to_call(@_); + my @args = (@{ $self->curried_arguments }, @_); + $proxy->$method_to_call(@args); }; } @@ -137,12 +148,21 @@ accessor is being generated for. This options is B. The method in the associated attribute's value to which we delegate. This can be either a method name or a code reference. +=item I + +An array reference of arguments that will be prepended to the argument list for +any call to the delegating method. + =back =item B<< $metamethod->associated_attribute >> Returns the attribute associated with this method. +=item B<< $metamethod->curried_arguments >> + +Return any curried arguments that will be passed to the delegated method. + =item B<< $metamethod->delegate_to_method >> Returns the method to which this method delegates, as passed to the diff --git a/t/020_attributes/010_attribute_delegation.t b/t/020_attributes/010_attribute_delegation.t index 45505a1..7e44c45 100644 --- a/t/020_attributes/010_attribute_delegation.t +++ b/t/020_attributes/010_attribute_delegation.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 88; +use Test::More tests => 89; use Test::Exception; @@ -27,7 +27,10 @@ use Test::Exception; has 'foo' => ( is => 'rw', default => sub { Foo->new }, - handles => { 'foo_bar' => 'bar' } + handles => { + 'foo_bar' => 'bar', + 'foo_bar_to_20' => [ bar => [ 20 ] ], + } ); } @@ -81,6 +84,10 @@ is($bar->foo, $foo, '... assigned bar->foo with the new Foo'); is($bar->foo->bar, 25, '... bar->foo->bar returned the right result'); is($bar->foo_bar, 25, '... and bar->foo_bar delegated correctly again'); +# curried handles +$bar->foo_bar_to_20; +is($bar->foo_bar, 20, '... correctly curried a single argument'); + # ------------------------------------------------------------------- # ARRAY handles # -------------------------------------------------------------------