make inlining a bit more easily extensible
[gitmo/Class-MOP.git] / lib / Class / MOP / Method / Accessor.pm
index b4377e9..5464f8f 100644 (file)
@@ -91,147 +91,138 @@ sub _initialize_body {
 ## generators
 
 sub _generate_accessor_method {
-    my $attr = (shift)->associated_attribute;
-    return sub {
-        $attr->set_value($_[0], $_[1]) if scalar(@_) == 2;
-        $attr->get_value($_[0]);
-    };
-}
+    my $self = shift;
+    my $attr = $self->associated_attribute;
 
-sub _generate_reader_method {
-    my $attr = (shift)->associated_attribute;
     return sub {
-        confess "Cannot assign a value to a read-only accessor" if @_ > 1;
+        if (@_ >= 2) {
+            $attr->set_value($_[0], $_[1]);
+        }
         $attr->get_value($_[0]);
     };
 }
 
-
-sub _generate_writer_method {
-    my $attr = (shift)->associated_attribute;
-    return sub {
-        $attr->set_value($_[0], $_[1]);
-    };
-}
-
-sub _generate_predicate_method {
-    my $attr = (shift)->associated_attribute;
-    return sub {
-        $attr->has_value($_[0])
-    };
-}
-
-sub _generate_clearer_method {
-    my $attr = (shift)->associated_attribute;
-    return sub {
-        $attr->clear_value($_[0])
-    };
-}
-
-## Inline methods
-
 sub _generate_accessor_method_inline {
     my $self = shift;
     my $attr = $self->associated_attribute;
 
-    my $code = try {
-        $self->_compile_code(
-            source => [
-                'sub {',
-                    $attr->inline_set( '$_[0]', '$_[1]' )
-                        . ' if scalar(@_) == 2;',
-                    $attr->inline_get('$_[0]') . ';',
+    return try {
+        $self->_compile_code([
+            'sub {',
+                'if (@_ >= 2) {',
+                    $attr->_inline_set_value('$_[0]', '$_[1]'),
                 '}',
-            ]
-        );
+                $attr->_inline_get_value('$_[0]'),
+            '}',
+        ]);
     }
     catch {
         confess "Could not generate inline accessor because : $_";
     };
+}
+
+sub _generate_reader_method {
+    my $self = shift;
+    my $attr = $self->associated_attribute;
 
-    return $code;
+    return sub {
+        confess "Cannot assign a value to a read-only accessor"
+            if @_ > 1;
+        $attr->get_value($_[0]);
+    };
 }
 
 sub _generate_reader_method_inline {
     my $self = shift;
     my $attr = $self->associated_attribute;
 
-    my $code = try {
-        $self->_compile_code(
-            source => [
-                'sub {',
-                    'confess "Cannot assign a value to a read-only accessor" '
-                        . 'if @_ > 1;',
-                    $attr->inline_get('$_[0]') . ';',
-                '}',
-            ],
-        );
+    return try {
+        $self->_compile_code([
+            'sub {',
+                'confess "Cannot assign a value to a read-only accessor"',
+                    'if @_ > 1;',
+                $attr->_inline_get_value('$_[0]'),
+            '}',
+        ]);
     }
     catch {
         confess "Could not generate inline reader because : $_";
     };
+}
+
+sub _generate_writer_method {
+    my $self = shift;
+    my $attr = $self->associated_attribute;
 
-    return $code;
+    return sub {
+        $attr->set_value($_[0], $_[1]);
+    };
 }
 
 sub _generate_writer_method_inline {
     my $self = shift;
     my $attr = $self->associated_attribute;
 
-    my $code = try {
-        $self->_compile_code(
-            source => [
-                'sub {',
-                    $attr->inline_set( '$_[0]', '$_[1]' ) . ';',
-                '}',
-            ],
-        );
+    return try {
+        $self->_compile_code([
+            'sub {',
+                $attr->_inline_set_value('$_[0]', '$_[1]'),
+            '}',
+        ]);
     }
     catch {
         confess "Could not generate inline writer because : $_";
     };
+}
+
+sub _generate_predicate_method {
+    my $self = shift;
+    my $attr = $self->associated_attribute;
 
-    return $code;
+    return sub {
+        $attr->has_value($_[0])
+    };
 }
 
 sub _generate_predicate_method_inline {
     my $self = shift;
     my $attr = $self->associated_attribute;
 
-    my $code = try {
-        $self->_compile_code(
-            source => [
-                'sub {',
-                    $attr->inline_has('$_[0]') . ';',
-                '}',
-            ],
-        );
+    return try {
+        $self->_compile_code([
+            'sub {',
+                $attr->_inline_has_value('$_[0]'),
+            '}',
+        ]);
     }
     catch {
         confess "Could not generate inline predicate because : $_";
     };
+}
+
+sub _generate_clearer_method {
+    my $self = shift;
+    my $attr = $self->associated_attribute;
 
-    return $code;
+    return sub {
+        $attr->clear_value($_[0])
+    };
 }
 
 sub _generate_clearer_method_inline {
     my $self = shift;
     my $attr = $self->associated_attribute;
 
-    my $code = try {
-        $self->_compile_code(
-            source => [
-                'sub {',
-                    $attr->inline_clear('$_[0]') . ';',
-                '}',
-            ],
-        );
+    return try {
+        $self->_compile_code([
+            'sub {',
+                $attr->_inline_clear_value('$_[0]'),
+            '}',
+        ]);
     }
     catch {
         confess "Could not generate inline clearer because : $_";
     };
-
-    return $code;
 }
 
 1;