X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FAccessor%2FNative%2FWriter.pm;h=98bce7254884d0c36ebed4b3c01e2996da4dcc33;hb=ad46f5244f59757c45306c4a41e195b7aa4b0943;hp=9ec8777b5e6c436aa7bbbbd4b42e16ae25e3fd9b;hpb=1e2c801e852e22b0ab5af1efc34667710ba952de;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Accessor/Native/Writer.pm b/lib/Moose/Meta/Method/Accessor/Native/Writer.pm index 9ec8777..98bce72 100644 --- a/lib/Moose/Meta/Method/Accessor/Native/Writer.pm +++ b/lib/Moose/Meta/Method/Accessor/Native/Writer.pm @@ -5,8 +5,6 @@ use warnings; use List::MoreUtils qw( any ); -our $VERSION = '1.19'; -$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; use Moose::Role; @@ -23,11 +21,9 @@ sub _generate_method { return ( 'sub {', - $self->_inline_pre_body(@_), 'my ' . $inv . ' = shift;', $self->_inline_curried_arguments, $self->_inline_writer_core($inv, $slot_access), - $self->_inline_post_body(@_), '}', ); } @@ -44,7 +40,7 @@ sub _inline_writer_core { $self->_inline_check_argument_count, $self->_inline_process_arguments($inv, $slot_access), $self->_inline_check_arguments('for writer'), - $self->_inline_check_lazy($inv), + $self->_inline_check_lazy($inv, '$type_constraint', '$type_constraint_obj'), ); if ($self->_return_value($slot_access)) { @@ -56,7 +52,7 @@ sub _inline_writer_core { push @code, ( $self->_inline_coerce_new_values, $self->_inline_copy_native_value(\$potential), - $self->_inline_tc_code($potential), + $self->_inline_tc_code($potential, '$type_constraint', '$type_constraint_obj'), $self->_inline_get_old_value_for_trigger($inv, $old), $self->_inline_capture_return_value($slot_access), $self->_inline_set_new_value($inv, $potential, $slot_access), @@ -73,7 +69,7 @@ sub _inline_check_arguments { return } sub _inline_coerce_new_values { return } -sub _value_needs_copy { +sub _writer_value_needs_copy { my $self = shift; return $self->_constraint_must_be_checked; @@ -103,7 +99,7 @@ sub _inline_copy_native_value { my $self = shift; my ($potential_ref) = @_; - return unless $self->_value_needs_copy; + return unless $self->_writer_value_needs_copy; my $code = 'my $potential = ' . ${$potential_ref} . ';'; @@ -115,7 +111,7 @@ sub _inline_copy_native_value { around _inline_tc_code => sub { my $orig = shift; my $self = shift; - my ($value, $for_lazy) = @_; + my ($value, $tc, $tc_obj, $for_lazy) = @_; return unless $for_lazy || $self->_constraint_must_be_checked; @@ -124,20 +120,20 @@ around _inline_tc_code => sub { sub _inline_check_coercion { my $self = shift; - my ($value) = @_; + my ($value, $tc, $tc_obj) = @_; my $attr = $self->associated_attribute; return unless $attr->should_coerce && $attr->type_constraint->has_coercion; # We want to break the aliasing in @_ in case the coercion tries to make a # destructive change to an array member. - return $value . ' = $type_constraint_obj->coerce(' . $value . ');'; + return $value . ' = ' . $tc_obj . '->coerce(' . $value . ');'; } around _inline_check_constraint => sub { my $orig = shift; my $self = shift; - my ($value, $for_lazy) = @_; + my ($value, $tc, $tc_obj, $for_lazy) = @_; return unless $for_lazy || $self->_constraint_must_be_checked; @@ -146,20 +142,15 @@ around _inline_check_constraint => sub { sub _inline_capture_return_value { return } -sub _set_new_value { +sub _inline_set_new_value { my $self = shift; - return $self->_store_value(@_) - if $self->_value_needs_copy + return $self->_inline_store_value(@_) + if $self->_writer_value_needs_copy || !$self->_slot_access_can_be_inlined || !$self->_get_is_lvalue; - return $self->_optimized_set_new_value(@_); -} - -sub _inline_set_new_value { - my $self = shift; - return $self->_set_new_value(@_) . ';'; + return $self->_inline_optimized_set_new_value(@_); } sub _get_is_lvalue { @@ -168,10 +159,10 @@ sub _get_is_lvalue { return $self->associated_attribute->associated_class->instance_metaclass->inline_get_is_lvalue; } -sub _optimized_set_new_value { +sub _inline_optimized_set_new_value { my $self = shift; - return $self->_store_value(@_); + return $self->_inline_store_value(@_); } sub _return_value {