X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FAccessor%2FNative%2FHash%2Fset.pm;h=1f2d3d855358c55cc2f9115a56a1b4979570c9a5;hb=ad46f5244f59757c45306c4a41e195b7aa4b0943;hp=62850ca0e364107fce879196a0025b799866331d;hpb=f4b86ac0e1fd7ff8a180f2f8332821170db5371e;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm b/lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm index 62850ca..1f2d3d8 100644 --- a/lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm +++ b/lib/Moose/Meta/Method/Accessor/Native/Hash/set.pm @@ -3,10 +3,9 @@ package Moose::Meta::Method::Accessor::Native::Hash::set; use strict; use warnings; +use List::MoreUtils (); use Scalar::Util qw( looks_like_number ); -our $VERSION = '1.16'; -$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; use Moose::Role; @@ -18,6 +17,7 @@ with 'Moose::Meta::Method::Accessor::Native::Hash::Writer' => { _maximum_arguments _inline_process_arguments _inline_check_arguments + _inline_coerce_new_values _inline_optimized_set_new_value _return_value ) @@ -32,50 +32,83 @@ around _inline_check_argument_count => sub { my $orig = shift; my $self = shift; - return - $self->$orig(@_) . "\n" - . $self->_inline_throw_error( - q{'You must pass an even number of arguments to set'}) - . ' if @_ % 2;'; + return ( + $self->$orig(@_), + 'if (@_ % 2) {', + $self->_inline_throw_error( + '"You must pass an even number of arguments to set"', + ) . ';', + '}', + ); }; sub _inline_process_arguments { my $self = shift; - return 'my @keys_idx = grep { ! ($_ % 2) } 0..$#_;' . "\n" - . 'my @values_idx = grep { $_ % 2 } 0..$#_;'; + return ( + 'my @keys_idx = grep { ! ($_ % 2) } 0..$#_;', + 'my @values_idx = grep { $_ % 2 } 0..$#_;', + ); } sub _inline_check_arguments { my $self = shift; - return - 'for (@keys_idx) {' . "\n" - . $self->_inline_throw_error( - q{'Hash keys passed to set must be defined'}) - . ' unless defined $_[$_];' . "\n" . '}'; + return ( + 'for (@keys_idx) {', + 'if (!defined($_[$_])) {', + $self->_inline_throw_error( + '"Hash keys passed to set must be defined"', + ) . ';', + '}', + '}', + ); } sub _adds_members { 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; + + # Is there a simpler way to do this? + return ( + 'my $iter = List::MoreUtils::natatime(2, @_);', + '@_ = ();', + 'while (my ($key, $val) = $iter->()) {', + 'push @_, $key, $member_tc_obj->coerce($val);', + '}', + ); +}; + sub _potential_value { - my ( $self, $slot_access ) = @_; + my $self = shift; + my ($slot_access) = @_; - return "{ %{ $slot_access }, \@_ }"; + return '{ %{ (' . $slot_access . ') }, @_ }'; } sub _new_members { '@_[ @values_idx ]' } sub _inline_optimized_set_new_value { - my ( $self, $inv, $new, $slot_access ) = @_; + my $self = shift; + my ($inv, $new, $slot_access) = @_; - return "\@{ $slot_access }{ \@_[ \@keys_idx] } = \@_[ \@values_idx ]"; + return '@{ (' . $slot_access . ') }{ @_[@keys_idx] } = @_[@values_idx];'; } sub _return_value { - my ( $self, $slot_access ) = @_; + my $self = shift; + my ($slot_access) = @_; - return "return wantarray ? \@{ $slot_access }{ \@_[ \@keys_idx ] } : ${slot_access}->{ \$_[ \$keys_idx[0] ] };"; + return 'wantarray ' + . '? @{ (' . $slot_access . ') }{ @_[@keys_idx] } ' + . ': ' . $slot_access . '->{ $_[$keys_idx[0]] }'; } no Moose::Role;