my $self = shift;
my @BUILD_calls;
foreach my $method ($self->associated_metaclass->find_all_methods_by_name('BUILD')) {
- push @BUILD_calls => '$instance->' . $method->{class} . '::BUILD(\%params);';
+ push @BUILD_calls => '$instance->' . $method->{class} . '::BUILD(\%params)';
}
return join "\n" => @BUILD_calls;
}
'|| confess "Attribute (' . $attr->name . ') is required";');
}
- push @source => 'if ($params{\'' . $attr->init_arg . '\'}) {';
-
- push @source => ('my $val = $params{\'' . $attr->init_arg . '\'};');
- if ($attr->has_type_constraint) {
- push @source => ('my $type_constraint = $attrs->[' . $index . ']->type_constraint;');
-
- if ($attr->should_coerce && $attr->type_constraint->has_coercion) {
- push @source => $self->_generate_type_coercion($attr, '$type_constraint', '$val', '$val');
- }
- push @source => $self->_generate_type_constraint_check($attr, '$type_constraint', '$val');
- }
- push @source => $self->_generate_slot_assignment($attr, '$val');
-
if ($attr->has_default && !$attr->is_lazy) {
+ push @source => 'if (exists $params{\'' . $attr->init_arg . '\'}) {';
+
+ push @source => ('my $val = $params{\'' . $attr->init_arg . '\'};');
+ if ($attr->has_type_constraint) {
+ push @source => ('my $type_constraint = $attrs->[' . $index . ']->type_constraint;');
+
+ if ($attr->should_coerce && $attr->type_constraint->has_coercion) {
+ push @source => $self->_generate_type_coercion($attr, '$type_constraint', '$val', '$val');
+ }
+ push @source => $self->_generate_type_constraint_check($attr, '$type_constraint', '$val');
+ }
+ push @source => $self->_generate_slot_assignment($attr, '$val');
+
+
push @source => "} else {";
my $default = $self->_generate_default_value($attr, $index);
push @source => "}";
}
else {
+ push @source => '(exists $params{\'' . $attr->init_arg . '\'}) && do {';
+
+ push @source => ('my $val = $params{\'' . $attr->init_arg . '\'};');
+ if ($attr->has_type_constraint) {
+ push @source => ('my $type_constraint = $attrs->[' . $index . ']->type_constraint;');
+
+ if ($attr->should_coerce && $attr->type_constraint->has_coercion) {
+ push @source => $self->_generate_type_coercion($attr, '$type_constraint', '$val', '$val');
+ }
+ push @source => $self->_generate_type_constraint_check($attr, '$type_constraint', '$val');
+ }
+ push @source => $self->_generate_slot_assignment($attr, '$val');
+
push @source => "}";
}