($code, delete $self->{captures});
}
+sub _attr_desc {
+ my ($name, $init_arg) = @_;
+ return perlstring($name) if !defined($init_arg) or $init_arg eq $name;
+ return perlstring($name).' (constructor argument: '.perlstring($init_arg).')';
+}
+
sub _generate_coerce {
- my ($self, $name, $value, $coerce) = @_;
+ my ($self, $name, $value, $coerce, $init_arg) = @_;
$self->_generate_die_prefix(
- "coercion for ${\perlstring($name)} failed: ",
+ "coercion for ${\_attr_desc($name, $init_arg)} failed: ",
$self->_generate_call_code($name, 'coerce', "${value}", $coerce)
);
}
}
sub _generate_isa_check {
- my ($self, $name, $value, $check) = @_;
+ my ($self, $name, $value, $check, $init_arg) = @_;
$self->_generate_die_prefix(
- "isa check for ${\perlstring($name)} failed: ",
+ "isa check for ${\_attr_desc($name, $init_arg)} failed: ",
$self->_generate_call_code($name, 'isa_check', $value, $check)
);
}
}
sub _generate_populate_set {
- my ($self, $me, $name, $spec, $source, $test) = @_;
+ my ($self, $me, $name, $spec, $source, $test, $init_arg) = @_;
if ($self->has_eager_default($name, $spec)) {
my $get_indent = ' ' x ($spec->{isa} ? 6 : 4);
my $get_default = $self->_generate_get_default(
if ($spec->{coerce}) {
$get_value = $self->_generate_coerce(
$name, $get_value,
- $spec->{coerce}
+ $spec->{coerce}, $init_arg
)
}
($spec->{isa}
? " {\n my \$value = ".$get_value.";\n "
.$self->_generate_isa_check(
- $name, '$value', $spec->{isa}
+ $name, '$value', $spec->{isa}, $init_arg
).";\n"
.' '.$self->_generate_simple_set($me, $name, $spec, '$value').";\n"
." }\n"
? " $source = "
.$self->_generate_coerce(
$name, $source,
- $spec->{coerce}
+ $spec->{coerce}, $init_arg
).";\n"
: ""
)
.($spec->{isa}
? " "
.$self->_generate_isa_check(
- $name, $source, $spec->{isa}
+ $name, $source, $spec->{isa}, $init_arg
).";\n"
: ""
)
Moo::_Utils::lt_5_8_3() ? <<"EOC" : $weak_simple;
my \$preserve;
- eval { Scalar::Util::weaken($simple); 1 } or do {
- if( \$@ =~ /Modification of a read-only value attempted/) {
- require Carp;
- Carp::croak( sprintf (
- 'Reference to readonly value in "%s" can not be weakened on Perl < 5.8.3',
- $name_str,
- ) );
- } else {
- die \$@;
+ eval { Scalar::Util::weaken($simple); 1 }
+ ? do { no warnings 'void'; \$preserve; }
+ : do {
+ if( \$@ =~ /Modification of a read-only value attempted/) {
+ require Carp;
+ Carp::croak( sprintf (
+ 'Reference to readonly value in "%s" can not be weakened on Perl < 5.8.3',
+ $name_str,
+ ) );
+ } else {
+ die \$@;
+ }
}
- };
EOC
} else {
$self->_generate_core_set($me, $name, $spec, $value);