X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FDelegation.pm;h=32436d6844c2d513b5e6ec56056ec8a48da05e6b;hb=d1ef0daf972b8d8a599b4e37b724702025647543;hp=5e641907f231209802dd4e2d3c465c25eb8681bf;hpb=e8ec69b65dab6111b542ca1e9ee7bd3cfb0cbdd5;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Delegation.pm b/lib/Moose/Meta/Method/Delegation.pm index 5e64190..32436d6 100644 --- a/lib/Moose/Meta/Method/Delegation.pm +++ b/lib/Moose/Meta/Method/Delegation.pm @@ -7,10 +7,6 @@ use warnings; use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; -our $VERSION = '0.84'; -$VERSION = eval $VERSION; -our $AUTHORITY = 'cpan:STEVAN'; - use base 'Moose::Meta::Method', 'Class::MOP::Method::Generated'; @@ -88,40 +84,57 @@ sub _initialize_body { $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->associated_attribute->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 ); - my @args = (@{ $self->curried_arguments }, @_); - $proxy->$method_to_call(@args); + } + unshift @_, @{ $self->curried_arguments }; + $proxy->$method_to_call(@_); }; } sub _get_delegate_accessor { my $self = shift; - - my $accessor = $self->associated_attribute->get_read_method_ref; - - $accessor = $accessor->body if blessed $accessor; + my $attr = $self->associated_attribute; + + # NOTE: + # always use a named method when + # possible, if you use the method + # ref and there are modifiers on + # the accessors then it will not + # pick up the modifiers too. Only + # the named method will assure that + # we also have any modifiers run. + # - SL + my $accessor = $attr->has_read_method + ? $attr->get_read_method + : $attr->get_read_method_ref; + + $accessor = $accessor->body if Scalar::Util::blessed $accessor; return $accessor; } 1; +# ABSTRACT: A Moose Method metaclass for delegation methods + __END__ =pod -=head1 NAME - -Moose::Meta::Method::Delegation - A Moose Method metaclass for delegation methods - =head1 DESCRIPTION This is a subclass of L for delegation @@ -171,21 +184,6 @@ constructor. =head1 BUGS -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. - -=head1 AUTHOR - -Dave Rolsky Eautarch@urth.orgE - -=head1 COPYRIGHT AND LICENSE - -Copyright 2009 by Infinity Interactive, Inc. - -L - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. +See L for details on reporting bugs. =cut