start pushing constructor inlining back into the metaclass
[gitmo/Class-MOP.git] / lib / Class / MOP / Method / Constructor.pm
index 3755a4e..b64c1c5 100644 (file)
@@ -89,10 +89,6 @@ sub _initialize_body {
     $self->{'body'} = $self->$method_name;
 }
 
-sub _generate_constructor_method {
-    return sub { Class::MOP::Class->initialize(shift)->new_object(@_) }
-}
-
 sub _eval_environment {
     my $self = shift;
     my $defaults = [map { $_->default } @{ $self->_attributes }];
@@ -101,23 +97,18 @@ sub _eval_environment {
     };
 }
 
+sub _generate_constructor_method {
+    return sub { Class::MOP::Class->initialize(shift)->new_object(@_) }
+}
+
 sub _generate_constructor_method_inline {
     my $self = shift;
 
     my $meta = $self->associated_metaclass;
 
-    my $idx = 0;
     my @source = (
         'sub {',
-            'my $class = shift;',
-            'return Class::MOP::Class->initialize($class)->new_object(@_)',
-                'if $class ne \'' . $meta->name . '\';',
-            'my $params = @_ == 1 ? $_[0] : {@_};',
-            'my $instance = ' . $meta->inline_create_instance('$class') . ';',
-            (map { $self->_generate_slot_initializer($_, $idx++) }
-                 @{ $self->_attributes }),
-            $self->_preserve_weak_metaclasses,
-            'return $instance',
+            $meta->_inline_new_object,
         '}',
     );
 
@@ -134,78 +125,6 @@ sub _generate_constructor_method_inline {
     return $code;
 }
 
-sub _generate_slot_initializer {
-    my $self  = shift;
-    my ($attr, $idx) = @_;
-
-    my $default = $self->_generate_default_value($attr, $idx);
-
-    if (defined(my $init_arg = $attr->init_arg)) {
-        my @source = (
-            'if (exists $params->{\'' . $init_arg . '\'}) {',
-                $attr->_inline_set_value(
-                    '$instance', '$params->{\'' . $init_arg . '\'}'
-                ),
-            '}',
-        );
-        if (defined $default) {
-            push @source, (
-                'else {',
-                    $attr->_inline_set_value('$instance', $default),
-                '}',
-            );
-        }
-        return @source;
-    }
-    elsif (defined $default) {
-        return $attr->_inline_set_value('$instance', $default);
-    }
-    else {
-        return ();
-    }
-}
-
-sub _preserve_weak_metaclasses {
-    my $self = shift;
-    my $meta = $self->associated_metaclass;
-    if (Class::MOP::metaclass_is_weak($meta->name)) {
-        return (
-            $meta->_inline_set_mop_slot(
-                '$instance', 'Class::MOP::class_of($class)'
-            ) . ';'
-        );
-    }
-    else {
-        return ();
-    }
-}
-
-sub _generate_default_value {
-    my $self = shift;
-    my ($attr, $index) = @_;
-
-    if ($attr->has_default) {
-        # NOTE:
-        # default values can either be CODE refs
-        # in which case we need to call them. Or
-        # they can be scalars (strings/numbers)
-        # in which case we can just deal with them
-        # in the code we eval.
-        if ($attr->is_default_a_coderef) {
-            return '$defaults->[' . $index . ']->($instance)';
-        }
-        else {
-            return '$defaults->[' . $index . ']';
-        }
-    }
-    elsif ($attr->has_builder) {
-        return '$instance->' . $attr->builder;
-    }
-    else {
-        return;
-    }
-}
-
 1;
 
 __END__