Version 1.12
[gitmo/Class-MOP.git] / lib / Class / MOP / Method / Constructor.pm
index df68a61..3eb342f 100644 (file)
@@ -7,7 +7,7 @@ use warnings;
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken';
 
-our $VERSION   = '1.04';
+our $VERSION   = '1.12';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -72,11 +72,6 @@ sub associated_metaclass { (shift)->{'associated_metaclass'} }
 
 ## cached values ...
 
-sub _meta_instance {
-    my $self = shift;
-    $self->{'meta_instance'} ||= $self->associated_metaclass->get_meta_instance;
-}
-
 sub _attributes {
     my $self = shift;
     $self->{'attributes'} ||= [ $self->associated_metaclass->get_all_attributes ]
@@ -114,11 +109,14 @@ sub _generate_constructor_method_inline {
 
     $source .= "\n" . 'my $params = @_ == 1 ? $_[0] : {@_};';
 
-    $source .= "\n" . 'my $instance = ' . $self->_meta_instance->inline_create_instance('$class');
+    $source .= "\n" . 'my $instance = ' . $self->associated_metaclass->inline_create_instance('$class');
     my $idx = 0;
     $source .= ";\n" . (join ";\n" => map {
         $self->_generate_slot_initializer($_, $idx++)
     } @{ $self->_attributes });
+    if (Class::MOP::metaclass_is_weak($self->associated_metaclass->name)) {
+        $source .= ";\n" . $self->associated_metaclass->_inline_set_mop_slot('$instance', 'Class::MOP::class_of($class)');
+    }
     $source .= ";\n" . 'return $instance';
     $source .= ";\n" . '}';
     warn $source if $self->options->{debug};
@@ -144,28 +142,37 @@ sub _generate_slot_initializer {
         $default = '$instance->'.$attr->builder;
     }
 
-    if ( defined(my $init_arg = $attr->init_arg) ) {
-      return (
-          'if(exists $params->{\'' . $init_arg . '\'}){' . "\n" .
-                $self->_meta_instance->inline_set_slot_value(
-                    '$instance',
-                    $attr->name,
-                    '$params->{\'' . $init_arg . '\'}' ) . "\n" .
-           '} ' . (!defined $default ? '' : 'else {' . "\n" .
-                $self->_meta_instance->inline_set_slot_value(
+    if ( defined( my $init_arg = $attr->init_arg ) ) {
+        return (
+                  'if(exists $params->{\'' 
+                . $init_arg . '\'}){' . "\n"
+                . $attr->inline_set(
+                '$instance',
+                '$params->{\'' . $init_arg . '\'}'
+                )
+                . "\n" . '} '
+                . (
+                !defined $default ? '' : 'else {' . "\n"
+                    . $attr->inline_set(
                     '$instance',
-                    $attr->name,
-                     $default ) . "\n" .
-           '}')
+                    $default
+                    )
+                    . "\n" . '}'
+                )
         );
-    } elsif ( defined $default ) {
+    }
+    elsif ( defined $default ) {
         return (
-            $self->_meta_instance->inline_set_slot_value(
+            $attr->inline_set(
                 '$instance',
-                $attr->name,
-                 $default ) . "\n"
+                $default
+                )
+                . "\n"
         );
-    } else { return '' }
+    }
+    else {
+        return '';
+    }
 }
 
 sub _generate_default_value {