From: Dave Rolsky Date: Fri, 20 Feb 2009 17:21:58 +0000 (+0000) Subject: Make the meta-instance class take a bare attribute name when inlining X-Git-Tag: 0.77_01~14 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e9a19694e92766a8d4de61fe2a576929748424c1;p=gitmo%2FClass-MOP.git Make the meta-instance class take a bare attribute name when inlining attribute-related bits. --- diff --git a/lib/Class/MOP/Instance.pm b/lib/Class/MOP/Instance.pm index 9806228..6808c2c 100644 --- a/lib/Class/MOP/Instance.pm +++ b/lib/Class/MOP/Instance.pm @@ -172,7 +172,7 @@ sub inline_create_instance { sub inline_slot_access { my ($self, $instance, $slot_name) = @_; - sprintf "%s->{%s}", $instance, $slot_name; + sprintf q[%s->{"%s"}], $instance, quotemeta($slot_name); } sub inline_get_slot_value { diff --git a/lib/Class/MOP/Method/Accessor.pm b/lib/Class/MOP/Method/Accessor.pm index e27d318..ea63b75 100644 --- a/lib/Class/MOP/Method/Accessor.pm +++ b/lib/Class/MOP/Method/Accessor.pm @@ -138,7 +138,7 @@ sub generate_reader_method_inline { {}, 'sub {' . 'confess "Cannot assign a value to a read-only accessor" if @_ > 1;' - . $meta_instance->inline_get_slot_value('$_[0]', "'$attr_name'") + . $meta_instance->inline_get_slot_value('$_[0]', $attr_name) . '}' ); } @@ -152,7 +152,7 @@ sub generate_writer_method_inline { return $self->_eval_closure( {}, 'sub {' - . $meta_instance->inline_set_slot_value('$_[0]', "'$attr_name'", '$_[1]') + . $meta_instance->inline_set_slot_value('$_[0]', $attr_name, '$_[1]') . '}' ); } @@ -167,7 +167,7 @@ sub generate_predicate_method_inline { return $self->_eval_closure( {}, 'sub {' - . $meta_instance->inline_is_slot_initialized('$_[0]', "'$attr_name'") + . $meta_instance->inline_is_slot_initialized('$_[0]', $attr_name) . '}' ); } @@ -181,7 +181,7 @@ sub generate_clearer_method_inline { return $self->_eval_closure( {}, 'sub {' - . $meta_instance->inline_deinitialize_slot('$_[0]', "'$attr_name'") + . $meta_instance->inline_deinitialize_slot('$_[0]', $attr_name) . '}' ); } diff --git a/lib/Class/MOP/Method/Constructor.pm b/lib/Class/MOP/Method/Constructor.pm index 64fa1eb..9d4a88c 100644 --- a/lib/Class/MOP/Method/Constructor.pm +++ b/lib/Class/MOP/Method/Constructor.pm @@ -149,12 +149,12 @@ sub _generate_slot_initializer { 'if(exists $params->{\'' . $attr->init_arg . '\'}){' . "\n" . $self->meta_instance->inline_set_slot_value( '$instance', - ("'" . $attr->name . "'"), + $attr->name, '$params->{\'' . $attr->init_arg . '\'}' ) . "\n" . '} ' . (!defined $default ? '' : 'else {' . "\n" . $self->meta_instance->inline_set_slot_value( '$instance', - ("'" . $attr->name . "'"), + $attr->name, $default ) . "\n" . '}') ); @@ -162,7 +162,7 @@ sub _generate_slot_initializer { return ( $self->meta_instance->inline_set_slot_value( '$instance', - ("'" . $attr->name . "'"), + $attr->name, $default ) . "\n" ); } else { return '' } diff --git a/t/061_instance_inline.t b/t/061_instance_inline.t index 95e986b..62f0eec 100644 --- a/t/061_instance_inline.t +++ b/t/061_instance_inline.t @@ -1,7 +1,7 @@ use strict; use warnings; -use Test::More tests => 15; +use Test::More tests => 6; use Test::Exception; use Class::MOP::Instance; @@ -10,7 +10,7 @@ my $C = 'Class::MOP::Instance'; { my $instance = '$self'; - my $slot_name = '"foo"'; + my $slot_name = 'foo'; my $value = '$value'; is($C->inline_get_slot_value($instance, $slot_name), @@ -38,67 +38,4 @@ my $C = 'Class::MOP::Instance'; '... got the right code for strengthen_slot_value'); } -{ - my $instance = '$_[0]'; - my $slot_name = '$attr_name'; - my $value = '[]'; - - is($C->inline_get_slot_value($instance, $slot_name), - '$_[0]->{$attr_name}', - '... got the right code for get_slot_value'); - - is($C->inline_set_slot_value($instance, $slot_name, $value), - '$_[0]->{$attr_name} = []', - '... got the right code for set_slot_value'); - - is($C->inline_initialize_slot($instance, $slot_name), - '', - '... got the right code for initialize_slot'); - - is($C->inline_is_slot_initialized($instance, $slot_name), - 'exists $_[0]->{$attr_name}', - '... got the right code for get_slot_value'); - - is($C->inline_weaken_slot_value($instance, $slot_name), - 'Scalar::Util::weaken( $_[0]->{$attr_name} )', - '... got the right code for weaken_slot_value'); - - is($C->inline_strengthen_slot_value($instance, $slot_name), - '$_[0]->{$attr_name} = $_[0]->{$attr_name}', - '... got the right code for strengthen_slot_value'); -} - -my $accessor_string = "sub {\n" -. $C->inline_set_slot_value('$_[0]', '$attr_name', '$_[1]') -. " if scalar \@_ == 2;\n" -. $C->inline_get_slot_value('$_[0]', '$attr_name') -. ";\n}"; - -is($accessor_string, - q|sub { -$_[0]->{$attr_name} = $_[1] if scalar @_ == 2; -$_[0]->{$attr_name}; -}|, - '... got the right code string for accessor'); - -my $reader_string = "sub {\n" -. $C->inline_get_slot_value('$_[0]', '$attr_name') -. ";\n}"; - -is($reader_string, - q|sub { -$_[0]->{$attr_name}; -}|, - '... got the right code string for reader'); - -my $writer_string = "sub {\n" -. $C->inline_set_slot_value('$_[0]', '$attr_name', '$_[1]') -. ";\n}"; - -is($writer_string, - q|sub { -$_[0]->{$attr_name} = $_[1]; -}|, - '... got the right code string for writer'); -