implement inlined access to the mop slot, to fix immutable anon classes
[gitmo/Class-MOP.git] / lib / Class / MOP / Method / Constructor.pm
index 74912e7..9a95e9e 100644 (file)
@@ -7,7 +7,7 @@ use warnings;
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken';
 
-our $VERSION   = '1.04';
+our $VERSION   = '1.10';
 $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};
@@ -145,23 +143,18 @@ sub _generate_slot_initializer {
     }
 
     if ( defined( my $init_arg = $attr->init_arg ) ) {
-        my $mi        = $self->_meta_instance;
-        my $attr_name = $attr->name;
-
         return (
                   'if(exists $params->{\'' 
                 . $init_arg . '\'}){' . "\n"
-                . $mi->inline_set_slot_value(
+                . $attr->inline_set(
                 '$instance',
-                $attr_name,
                 '$params->{\'' . $init_arg . '\'}'
                 )
                 . "\n" . '} '
                 . (
                 !defined $default ? '' : 'else {' . "\n"
-                    . $mi->inline_set_slot_value(
+                    . $attr->inline_set(
                     '$instance',
-                    $attr_name,
                     $default
                     )
                     . "\n" . '}'
@@ -170,9 +163,8 @@ sub _generate_slot_initializer {
     }
     elsif ( defined $default ) {
         return (
-            $self->_meta_instance->inline_set_slot_value(
+            $attr->inline_set(
                 '$instance',
-                $attr->name,
                 $default
                 )
                 . "\n"