actually, cmop should be handling initializers here too
[gitmo/Class-MOP.git] / lib / Class / MOP / Class.pm
index fbe64e4..26d4bda 100644 (file)
@@ -643,40 +643,77 @@ sub _inline_slot_initializers {
     my $idx = 0;
 
     return map { $self->_inline_slot_initializer($_, $idx++) }
-               $self->get_all_attributes;
+               sort { $a->name cmp $b->name } $self->get_all_attributes;
 }
 
 sub _inline_slot_initializer {
     my $self  = shift;
     my ($attr, $idx) = @_;
 
-    my $default = $self->_inline_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 . '\'}'
-                ),
+                $self->_inline_init_attr_from_constructor($attr, $idx),
             '}',
         );
-        if (defined $default) {
+        if (my @default = $self->_inline_init_attr_from_default($attr, $idx)) {
             push @source, (
                 'else {',
-                    $attr->_inline_set_value('$instance', $default),
+                    @default,
                 '}',
             );
         }
         return @source;
     }
-    elsif (defined $default) {
-        return $attr->_inline_set_value('$instance', $default);
+    elsif (my @default = $self->_inline_init_attr_from_default($attr, $idx)) {
+        return (
+            '{',
+                @default,
+            '}',
+        );
     }
     else {
         return ();
     }
 }
 
+sub _inline_init_attr_from_constructor {
+    my $self = shift;
+    my ($attr, $idx) = @_;
+
+    my @initial_value = $attr->_inline_set_value(
+        '$instance', '$params->{\'' . $attr->init_arg . '\'}',
+    );
+
+    push @initial_value, (
+        '$attrs->[' . $idx . ']->set_initial_value(',
+            '$instance,',
+            $attr->_inline_instance_get('$instance'),
+        ');',
+    ) if $attr->has_initializer;
+
+    return @initial_value;
+}
+
+sub _inline_init_attr_from_default {
+    my $self = shift;
+    my ($attr, $idx) = @_;
+
+    my $default = $self->_inline_default_value($attr, $idx);
+    return unless $default;
+
+    my @initial_value = $attr->_inline_set_value('$instance', $default);
+
+    push @initial_value, (
+        '$attrs->[' . $idx . ']->set_initial_value(',
+            '$instance,',
+            $attr->_inline_instance_get('$instance'),
+        ');',
+    ) if $attr->has_initializer;
+
+    return @initial_value;
+}
+
 sub _inline_default_value {
     my $self = shift;
     my ($attr, $index) = @_;