sub generate_constructor_method_inline {
my ($class, $meta) = @_;
- my @attrs = $meta->compute_all_applicable_attributes; # this one is using by evaled code
+ my @attrs = $meta->compute_all_applicable_attributes;
my $buildall = $class->_generate_BUILDALL($meta);
my $buildargs = $class->_generate_BUILDARGS();
my $processattrs = $class->_generate_processattrs($meta, \@attrs);
}
...
- warn $code if $ENV{DEBUG};
-
local $@;
my $res = eval $code;
die $@ if $@;
my $set_value = do {
my @code;
- if ($attr->should_coerce) {
- push @code, "my \$value = \$attr->coerce_constraint( \$args->{'$from'});";
+ if ($attr->should_coerce && $attr->type_constraint) {
+ push @code, "my \$value = Mouse::TypeRegistry->typecast_constraints('".$attr->associated_class->name."', \$attrs[$index]->{find_type_constraint}, \$attrs[$index]->{type_constraint}, \$args->{'$from'});";
}
else {
push @code, "my \$value = \$args->{'$from'};";
}
if ($attr->has_type_constraint) {
- push @code, "\$attr->verify_type_constraint( \$value );";
+ push @code, "{local \$_ = \$value; unless (\$attrs[$index]->{find_type_constraint}->(\$_)) {";
+ push @code, "\$attrs[$index]->verify_type_constraint_error('$key', \$_, \$attrs[$index]->type_constraint)}}";
}
push @code, "\$instance->{'$key'} = \$value;";
if ($attr->is_weak_ref) {
- push @code, "weaken( \$instance->{'$key'} ) if ref( \$value );";
+ push @code, "Scalar::Util::weaken( \$instance->{'$key'} ) if ref( \$value );";
}
if ( $attr->has_trigger ) {
- push @code, "\$attr->trigger->( \$instance, \$value, \$attr );";
+ push @code, "\$attrs[$index]->{trigger}->( \$instance, \$value, \$attrs[$index] );";
}
join "\n", @code;
push @code, "my \$value = ";
- if ($attr->should_coerce) {
- push @code, "\$attr->coerce_constraint(";
+ if ($attr->should_coerce && $attr->type_constraint) {
+ push @code, "Mouse::TypeRegistry->typecast_constraints('".$attr->associated_class->name."', \$attrs[$index]->{find_type_constraint}, \$attrs[$index]->{type_constraint}, ";
}
-
if ($attr->has_builder) {
push @code, "\$instance->$builder";
}
elsif (ref($default) eq 'CODE') {
- push @code, "\$attr->default()->()";
+ push @code, "\$attrs[$index]->{default}->(\$instance)";
+ }
+ elsif (!defined($default)) {
+ push @code, 'undef';
+ }
+ elsif ($default =~ /^\-?[0-9]+(?:\.[0-9]+)$/) {
+ push @code, $default;
}
else {
- push @code, "\$attr->default()";
+ push @code, "'$default'";
}
if ($attr->should_coerce) {
}
if ($attr->has_type_constraint) {
- push @code, "\$attr->verify_type_constraint(\$value);";
+ push @code, "{local \$_ = \$value; unless (\$attrs[$index]->{find_type_constraint}->(\$_)) {";
+ push @code, "\$attrs[$index]->verify_type_constraint_error('$key', \$_, \$attrs[$index]->type_constraint)}}";
}
push @code, "\$instance->{'$key'} = \$value;";
if ($attr->is_weak_ref) {
- push @code, "weaken( \$instance->{'$key'} ) if ref( \$value );";
+ push @code, "Scalar::Util::weaken( \$instance->{'$key'} ) if ref( \$value );";
}
}
join "\n", @code;
};
my $code = <<"...";
{
- my \$attr = \$attrs[$index];
if (exists(\$args->{'$from'})) {
$set_value;
+...
+ if ($make_default_value) {
+ $code .= <<"...";
} else {
$make_default_value;
+...
+ }
+ $code .= <<"...";
}
}
...