X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FDelegation.pm;h=54a53259f70d67f3f0ab4094a3d462b32a533d96;hb=ed5d4812547cdbda8cb46bde33e34064a84b52ee;hp=d08d3584093ee5732d6ffb0f8f0cc096a2adf95c;hpb=df8260e9a27a9d7532a21525223975fcf8e26562;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Delegation.pm b/lib/Moose/Meta/Method/Delegation.pm index d08d358..54a5325 100644 --- a/lib/Moose/Meta/Method/Delegation.pm +++ b/lib/Moose/Meta/Method/Delegation.pm @@ -7,7 +7,7 @@ use warnings; use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; -our $VERSION = '0.63'; +our $VERSION = '0.89'; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -36,6 +36,13 @@ 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} = [] ); + + ( $options{curried_arguments} && + ( 'ARRAY' eq ref $options{curried_arguments} ) ) + || confess 'You must supply a curried_arguments which is an ARRAY reference'; + my $self = $class->_new( \%options ); weaken( $self->{'attribute'} ); @@ -52,6 +59,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'} } @@ -70,21 +79,33 @@ sub _initialize_body { # NOTE: we used to do a goto here, but the goto didn't handle # failure correctly (it just returned nothing), so I took that # out. However, the more I thought about it, the less I liked it - # doing the goto, and I prefered the act of delegation being + # doing the goto, and I preferred the act of delegation being # actually represented in the stack trace. - SL + # not inlining this, since it won't really speed things up at + # all... the only thing that would end up different would be + # interpolating in $method_to_call, and a bunch of things in the + # error handling that mostly never gets called - doy $self->{body} = sub { my $instance = shift; my $proxy = $instance->$accessor(); - ( defined $proxy ) - || $self->throw_error( - "Cannot delegate $handle_name to $method_to_call because " - . "the value of " - . $self->name - . " is not defined", - method_name => $method_to_call, - object => $instance + + my $error + = !defined $proxy ? ' is not defined' + : ref($proxy) && !blessed($proxy) ? qq{ is not an object (got '$proxy')} + : undef; + + if ($error) { + $self->throw_error( + "Cannot delegate $handle_name to $method_to_call because " + . "the value of " + . $self->associated_attribute->name + . $error, + method_name => $method_to_call, + object => $instance ); - $proxy->$method_to_call(@_); + } + my @args = (@{ $self->curried_arguments }, @_); + $proxy->$method_to_call(@args); }; } @@ -117,38 +138,47 @@ methods. =over 4 -=item B +=item B<< Moose::Meta::Method::Delegation->new(%options) >> -This creates the method based on the criteria in C<%options>, -these options are: +This creates the delegation methods based on the provided C<%options>. =over 4 =item I This must be an instance of C which this -accessor is being generated for. This paramter is B. +accessor is being generated for. This options is B. =item I 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 +=item B<< $metamethod->associated_attribute >> Returns the attribute associated with this method. -=item B +=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. +Returns the method to which this method delegates, as passed to the +constructor. =back =head1 BUGS -All complex software has bugs lurking in it, and this module is no +All complex software has bugs lurking in it, and this module is no exception. If you find a bug please either email me, or add the bug to cpan-RT. @@ -158,7 +188,7 @@ Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE -Copyright 2008 by Infinity Interactive, Inc. +Copyright 2009 by Infinity Interactive, Inc. L