package Mouse::Meta::Method::Constructor;
-use strict;
-use warnings;
+use Mouse::Util; # enables strict and warnings
-sub generate_constructor_method_inline {
- my ($class, $metaclass) = @_;
+sub _generate_constructor_method {
+ my ($class, $metaclass, $args) = @_;
my $associated_metaclass_name = $metaclass->name;
my @attrs = $metaclass->get_all_attributes;
my @compiled_constraints = map { $_ ? $_->_compiled_type_constraint : undef }
map { $_->type_constraint } @attrs;
- my $code = sprintf("#line %d %s\n", __LINE__, __FILE__).<<"...";
- sub {
- my \$class = shift;
- return \$class->Mouse::Object::new(\@_)
- if \$class ne q{$associated_metaclass_name};
- $buildargs;
- my \$instance = bless {}, \$class;
- $processattrs;
- $buildall;
- return \$instance;
- }
+
+
+ my $source = sprintf("#line %d %s\n", __LINE__, __FILE__).<<"...";
+ sub \{
+ my \$class = shift;
+ return \$class->Mouse::Object::new(\@_)
+ if \$class ne q{$associated_metaclass_name};
+ $buildargs;
+ my \$instance = bless {}, \$class;
+ $processattrs;
+ $buildall;
+ return \$instance;
+ }
...
- local $@;
- my $res = eval $code;
- die $@ if $@;
- $res;
+ my $code;
+ my $e = do{
+ local $@;
+ $code = eval $source;
+ $@;
+ };
+ die $e if $e;
+
+ $metaclass->add_method($args->{constructor_name} => $code);
+ return;
}
sub _generate_processattrs {