X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FAccessor%2FNative%2FArray%2Finsert.pm;h=08d4723b80742e6a7943a1679c52410e84ee4c83;hb=d5f6cadef8d83deaf7dd95302908cd4f61aeab8a;hp=b5b40ee76e22dcc977548bb58e5727c0f22fa36e;hpb=e32b74894c664aec6fba53a8926f82ea546b4232;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm b/lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm index b5b40ee..08d4723 100644 --- a/lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm +++ b/lib/Moose/Meta/Method/Accessor/Native/Array/insert.pm @@ -3,11 +3,20 @@ package Moose::Meta::Method::Accessor::Native::Array::insert; use strict; use warnings; -our $VERSION = '1.13'; -$VERSION = eval $VERSION; -our $AUTHORITY = 'cpan:STEVAN'; +use Moose::Role; -use base 'Moose::Meta::Method::Accessor::Native::Array::Writer'; +with 'Moose::Meta::Method::Accessor::Native::Array::Writer' => { + -excludes => [ + qw( + _minimum_arguments + _maximum_arguments + _inline_coerce_new_values + _new_members + _inline_optimized_set_new_value + _return_value + ) + ] +}; sub _minimum_arguments { 2 } @@ -16,18 +25,44 @@ sub _maximum_arguments { 2 } sub _adds_members { 1 } sub _potential_value { - my ( $self, $slot_access ) = @_; + my $self = shift; + my ($slot_access) = @_; - return - "( do { my \@potential = \@{ $slot_access }; splice \@potential, \$_[0], 0, \$_[1]; \\\@potential } )"; + return '(do { ' + . 'my @potential = @{ (' . $slot_access . ') }; ' + . 'splice @potential, $_[0], 0, $_[1]; ' + . '\@potential; ' + . '})'; } -sub _new_values { '$_[1]' } +# We need to override this because while @_ can be written to, we cannot write +# directly to $_[1]. +sub _inline_coerce_new_values { + my $self = shift; + + return unless $self->associated_attribute->should_coerce; + + return unless $self->_tc_member_type_can_coerce; + + return '@_ = ($_[0], $member_tc_obj->coerce($_[1]));'; +}; + +sub _new_members { '$_[1]' } sub _inline_optimized_set_new_value { - my ( $self, $inv, $new, $slot_access ) = @_; + my $self = shift; + my ($inv, $new, $slot_access) = @_; - return "splice \@{ $slot_access }, \$_[0], 0, \$_[1];"; + return 'splice @{ (' . $slot_access . ') }, $_[0], 0, $_[1];'; } +sub _return_value { + my $self = shift; + my ($slot_access) = @_; + + return $slot_access . '->[ $_[0] ]'; +} + +no Moose::Role; + 1;