sub generate_constructor_method_inline {
my ($class, $meta) = @_;
- my @attrs = $meta->compute_all_applicable_attributes;
+ my $associated_metaclass_name = $meta->name;
+ my @attrs = $meta->get_all_attributes;
my $buildall = $class->_generate_BUILDALL($meta);
my $buildargs = $class->_generate_BUILDARGS($meta);
my $processattrs = $class->_generate_processattrs($meta, \@attrs);
my $code = <<"...";
sub {
my \$class = shift;
- my \$args = $buildargs;
+ return \$class->Mouse::Object::new(\@_)
+ if \$class ne '$associated_metaclass_name';
+ $buildargs;
my \$instance = bless {}, \$class;
$processattrs;
$buildall;
}
$code .= "
\$attrs[$index]->verify_type_constraint_error(
- '$key', \$_, \$attrs[$index]->type_constraint
+ '$key', \$value, \$attrs[$index]->type_constraint
)
}
";
if ($attr->has_type_constraint) {
$code .= "{
unless (\$attrs[$index]->{type_constraint}->check(\$value)) {
- \$attrs[$index]->verify_type_constraint_error('$key', \$_, \$attrs[$index]->type_constraint)
+ \$attrs[$index]->verify_type_constraint_error('$key', \$value, \$attrs[$index]->type_constraint)
}
}";
}
my $meta = shift;
if ($meta->name->can('BUILDARGS') && $meta->name->can('BUILDARGS') != Mouse::Object->can('BUILDARGS')) {
- return '$class->BUILDARGS(@_)';
+ return 'my $args = $class->BUILDARGS(@_)';
}
return <<'...';
- do {
+ my $args;
if ( scalar @_ == 1 ) {
( ref( $_[0] ) eq 'HASH' )
|| Carp::confess "Single parameters to new() must be a HASH ref";
- +{ %{ $_[0] } };
+ $args = +{ %{ $_[0] } };
}
else {
- +{@_};
+ $args = +{@_};
}
- };
...
}
no warnings 'once';
for my $klass ($meta->linearized_isa) {
if (*{ $klass . '::BUILD' }{CODE}) {
- push @code, qq{${klass}::BUILD(\$instance, \$args);};
+ unshift @code, qq{${klass}::BUILD(\$instance, \$args);};
}
}
return join "\n", @code;