X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FClass.pm;h=26d4bdabe3ab206753538312e540b74ef9152ee3;hb=398a82df319a28b66dfd22e98c87a0adfb12c83f;hp=891e611d7f5f467ea9ae967c7ce8d54436a53da3;hpb=cc66fac6ef15584503dfcbc1953da2d58aad7989;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Class.pm b/lib/Class/MOP/Class.pm index 891e611..26d4bda 100644 --- a/lib/Class/MOP/Class.pm +++ b/lib/Class/MOP/Class.pm @@ -650,33 +650,70 @@ 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) = @_;