Hello,
I have a problem with subtype/coercions (MooseX::Types library) that
I've
spent ages trying to understand, then ages trying abstract into a
simple
test case but all simple cases seem to work as expected but just not
in my
larger code base. I was hoping that if I put the symptoms up someone
may
spot what is going on and put me out of my misery (or at least point
me to
where I should continue my digging).
Please excuse any typos in the (incomplete) example code below. I
have coded
up a full version of this simple scenario and I can't replicate the
error
I'm getting in my real code base anyway - so this is meant purely
for
illustration.
# Types library
package My::Types;
use Moose;
use MooseX::Types -declare [qw( Version DomainID )];
use My::Version;
subtype 'Version',
as 'Object',
where { $_->isa( 'My::Version' ) };
coerce 'Version',
from 'Str',
via { My::Version::init_from_string( $_ ) };
subtype 'ObjectID',
as 'Str';
# Role to associate versions with objects
package My::Role::Verisoned;
use Moose::Role;
use My::Types qw(Version);
has 'version' => (is => 'rw', isa => 'Version', coerce => 1);
# Versioned Object1
package My::Object1;
use Moose;
with 'My::Role::Versioned';
# Versioned Object2
package My::Object2;
use Moose;
use My::Types qw( DomainID );
use My::Object1;
with 'My::Role::Versioned';
has 'domain_id' => ( is => 'rw', isa => 'DomainID' );
sub get_object1 {
my $self = shift;
return My::Object1->new( version => $self->version );
}
In this simple case, the subtype/coerce works as expected in both
objects
(the type constaint of the 'version' attribute is the identical)
$o2 = My::Object2->new( version => '3.2' );
$o1 = $o2->get_object1;
warn "Object1: " .
My::Object1->meta->get_attribute_map->{version}->{type_constraint}-
dump;
warn "Object2: " .
My::Object2->meta->get_attribute_map->{version}->{type_constraint}-
dump;
Object1: $VAR1 = bless( {
'compiled_type_constraint' => 'CODE(0xa41e310)',
'parent' => 'My::Version',
'coercion' =>
'Moose::Meta::TypeCoercion=HASH(0xa991c70)',
'name' => 'Version',
'constraint' => 'CODE(0x9eb4600)',
'package_defined_in' => 'My::Types'
}, 'Moose::Meta::TypeConstraint' );
Object2: $VAR1 = bless( {
'compiled_type_constraint' => 'CODE(0xa41e310)',
'parent' => 'My::Version',
'coercion' =>
'Moose::Meta::TypeCoercion=HASH(0xa991c70)',
'name' => 'Version',
'constraint' => 'CODE(0x9eb4600)',
'package_defined_in' => 'My::Types'
}, 'Moose::Meta::TypeConstraint' );
However, in what seems to be a similar scenario in my live code, I
get the
error that the 'version' attribute doesn't pass the type constraint
when
creating an instance of Object1 inside Object2::get_object1 (it no
longer
seems to be aware of the subtype/coercion in My::Types):
Attribute (version) does not pass the type constraint because:
Validation
failed for 'Version' failed with value
My::Version::V3_2_0=HASH(0x1aea0930)
at .../Moose/Meta/Attribute.pm line 415
When I look at the type constraint of the 'version' attribute in
these two
classes they now appear different:
warn "Object1: " .
My::Object1->meta->get_attribute_map->{version}->{type_constraint}-
dump;
warn "Object2: " .
My::Object2->meta->get_attribute_map->{version}->{type_constraint}-
dump;
Object1: $VAR1 = bless( {
'compiled_type_constraint' => 'CODE(0x1ae87c00)',
'parent' => 'Object',
'hand_optimized_type_constraint' =>
$VAR1->{'compiled_type_constraint'},
'name' => 'Version',
'constraint' => 'CODE(0x1a3c4b80)',
'class' => 'Version'
}, 'Moose::Meta::TypeConstraint::Class' );
Object2: $VAR1 = bless( {
'compiled_type_constraint' => 'CODE(0x1a929c10)',
'parent' => 'My::Version',
'coercion' =>
'Moose::Meta::TypeCoercion=HASH(0x1ae9da00)',
'name' => 'Version',
'constraint' => 'CODE(0x1a3c4b80)',
'package_defined_in' => 'My::Types'
}, 'Moose::Meta::TypeConstraint' );
I hope that difference shows what I might be doing wrong or where to
start
looking (parent => 'Object'? hand_optimized_type_constraint?). This
change
appears to be related to which modules have been "use"d -- in my
live code I
can remove this error by *taking out* the equivalent of "use
My::Types" on
Object2.
Very much appreciate any help/pointers.
Cheers,
Ian
--
Ian Sillitoe
CATH Team -- http://cathdb.info