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) = @_;