use Carp 'confess';
use Scalar::Util 'blessed', 'weaken', 'looks_like_number';
-our $VERSION = '0.56';
+our $VERSION = '0.57';
our $AUTHORITY = 'cpan:STEVAN';
use base 'Moose::Meta::Method',
if ( defined( my $init_arg = $attr->init_arg ) ) {
push @source => 'if (exists $params->{\'' . $init_arg . '\'}) {';
-
- push @source => ('my $val = $params->{\'' . $init_arg . '\'};');
-
- if ($is_moose && $attr->has_type_constraint) {
- if ($attr->should_coerce && $attr->type_constraint->has_coercion) {
- push @source => $self->_generate_type_coercion(
- $attr,
- '$type_constraints[' . $index . ']',
- '$val',
- '$val'
- );
- }
- push @source => $self->_generate_type_constraint_check(
- $attr,
- '$type_constraint_bodies[' . $index . ']',
- '$type_constraints[' . $index . ']',
- '$val'
- );
- }
- push @source => $self->_generate_slot_assignment($attr, '$val', $index);
-
+ push @source => ('my $val = $params->{\'' . $init_arg . '\'};');
+ push @source => $self->_generate_type_constraint_and_coercion($attr, $index)
+ if $is_moose;
+ push @source => $self->_generate_slot_assignment($attr, '$val', $index);
push @source => "} else {";
}
my $default;
push @source => '{'; # wrap this to avoid my $val overwrite warnings
push @source => ('my $val = ' . $default . ';');
- push @source => $self->_generate_type_constraint_check(
- $attr,
- ('$type_constraint_bodies[' . $index . ']'),
- ('$type_constraints[' . $index . ']'),
- '$val'
- ) if ($is_moose && $attr->has_type_constraint);
-
+ push @source => $self->_generate_type_constraint_and_coercion($attr, $index)
+ if $is_moose;
push @source => $self->_generate_slot_assignment($attr, '$val', $index);
push @source => '}'; # close - wrap this to avoid my $val overrite warnings
return $source;
}
+sub _generate_type_constraint_and_coercion {
+ my ($self, $attr, $index) = @_;
+
+ return unless $attr->has_type_constraint;
+
+ my @source;
+ if ($attr->should_coerce && $attr->type_constraint->has_coercion) {
+ push @source => $self->_generate_type_coercion(
+ $attr,
+ '$type_constraints[' . $index . ']',
+ '$val',
+ '$val'
+ );
+ }
+ push @source => $self->_generate_type_constraint_check(
+ $attr,
+ ('$type_constraint_bodies[' . $index . ']'),
+ ('$type_constraints[' . $index . ']'),
+ '$val'
+ );
+ return @source;
+}
+
sub _generate_type_coercion {
my ($self, $attr, $type_constraint_name, $value_name, $return_value_name) = @_;
return ($return_value_name . ' = ' . $type_constraint_name . '->coerce(' . $value_name . ');');
use strict;
use warnings;
-use Test::More tests => 3;
+use Test::More tests => 10;
use Test::Exception;
-
-
=pod
This tests to make sure that the inlined constructor
{
package Foo;
use Moose;
+ use Moose::Util::TypeConstraints;
+
+ coerce 'Int' => from 'Str' => via { length $_ ? $_ : 69 };
has 'foo' => (is => 'rw', isa => 'Int');
has 'baz' => (is => 'rw', isa => 'Int');
has 'zot' => (is => 'rw', isa => 'Int', init_arg => undef);
-
+ has 'moo' => (is => 'rw', isa => 'Int', coerce => 1, default => '', required => 1);
+ has 'boo' => (is => 'rw', isa => 'Int', coerce => 1, builder => '_build_boo', required => 1);
+
+ sub _build_boo { '' }
+
Foo->meta->add_attribute(
Class::MOP::Attribute->new(
'bar' => (
)
)
);
-
- Foo->meta->make_immutable(debug => 0);
}
-lives_ok {
- Foo->new(foo => 10, bar => "Hello World", baz => 10, zot => 4);
-} '... this passes the constuctor correctly';
+for (1..2) {
+ my $is_immutable = Foo->meta->is_immutable;
+ my $mutable_string = $is_immutable ? 'immutable' : 'mutable';
+ lives_ok {
+ my $f = Foo->new(foo => 10, bar => "Hello World", baz => 10, zot => 4);
+ is($f->moo, 69, "Type coersion works as expected on default ($mutable_string)");
+ is($f->boo, 69, "Type coersion works as expected on builder ($mutable_string)");
+ } "... this passes the constuctor correctly ($mutable_string)";
-lives_ok {
- Foo->new(foo => 10, bar => "Hello World", baz => 10, zot => "not an int");
-} "... the constructor doesn't care about 'zot'";
+ lives_ok {
+ Foo->new(foo => 10, bar => "Hello World", baz => 10, zot => "not an int");
+ } "... the constructor doesn't care about 'zot' ($mutable_string)";
-dies_ok {
- Foo->new(foo => "Hello World", bar => 100, baz => "Hello World");
-} '... this fails the constuctor correctly';
+ dies_ok {
+ Foo->new(foo => "Hello World", bar => 100, baz => "Hello World");
+ } "... this fails the constuctor correctly ($mutable_string)";
+ Foo->meta->make_immutable(debug => 0) unless $is_immutable;
+}