some optimizations to builder and lazy build along with better errors on inlined...
Guillermo Roditi [Mon, 29 Oct 2007 19:49:03 +0000 (19:49 +0000)]
lib/Moose/Meta/Attribute.pm
lib/Moose/Meta/Method/Accessor.pm

index 77cd5b6..1c64d20 100644 (file)
@@ -224,9 +224,11 @@ sub initialize_instance_slot {
         $val = $self->default($instance);
     } elsif (!defined $val && $self->has_builder) {
         my $builder = $self->builder;
-        confess(blessed($instance)." does not support builder method '$builder' for attribute '" . $self->name . "'")
-            unless $instance->can($builder);
-        $val = $instance->$builder;
+        if($builder = $instance->can($builder)){
+            $val = $instance->$builder;
+        } else {
+            confess(blessed($instance)." does not support builder method '$builder' for attribute '" . $self->name . "'");
+        }
     }
 
         if (defined $val || $self->has_default) {
@@ -313,9 +315,11 @@ sub get_value {
                 }
                 if ( $self->has_builder ){
                     my $builder = $self->builder;
-                    confess(blessed($instance)." does not support builder method '$builder' for attribute '" . $self->name . "'")
-                        unless $instance->can($builder);
-                    $self->set_value($instance, $instance->$builder);
+                    if($builder = $instance->can($builder)){
+                        $self->set_value($instance, $instance->$builder);
+                    } else {
+                        confess(blessed($instance)." does not support builder method '$builder' for attribute '" . $self->name . "'");
+                    }
                 } else {
                     $self->set_value($instance, undef);
                 }
index d5e67e3..504ae36 100644 (file)
@@ -161,9 +161,11 @@ sub _inline_check_lazy {
                    '        $default = $attr->default(' . $inv . ')  if $attr->has_default;' .
                    '        if ( $attr->has_builder ) { '.
                    '            my $builder = $self->builder;'.
-                   '            confess(blessed('.$inv.')." does not support builder method \'$builder\' for attribute \'" . $attr->name . "\'")'.
-                   '                unless '.$inv.'->can($builder); '.
-                   '            $default = '.$inv.'->$builder;'.
+                   '            if($builder = '.$inv.'->can($builder)){ '.
+                   '                $default = '.$inv.'->$builder; '.
+                   '            } else { '.
+                   '                confess(blessed('.$inv.')." does not support builder method \'$builder\' for attribute \'" . $attr->name . "\'");'.
+                   '            }'.
                    '        }'.
                    ($attr->should_coerce
                        ? '$default = $attr->type_constraint->coerce($default);'
@@ -182,8 +184,14 @@ sub _inline_check_lazy {
 
     return  'unless (exists ' . $slot_access . ') {' .
             '    if ($attr->has_default) { ' . $slot_access . ' = $attr->default(' . $inv . '); }' .
-            '    elsif ($attr->has_builder) { my $builder = $attr->builder; ' . $slot_access . ' = ' . $inv . '->$builder; }' .
-            '    else { ' .$slot_access . ' = undef; } '.
+            '    elsif ($attr->has_builder) { '.
+            '        my $builder = $attr->builder; ' .
+            '        if($builder = '.$inv.'->can($builder)){ '.
+            '            ' . $slot_access . ' = ' . $inv . '->$builder; '.
+            '        } else { '.
+            '            confess(blessed('.$inv.')." does not support builder method \'$builder\' for attribute \'" . $attr->name . "\'");'.
+            '        }'.
+            '    } else { ' .$slot_access . ' = undef; } '.
             '}';
 }