8 use Scalar::Util 'blessed';
10 use Moose::Util::TypeConstraints;
25 has lazy_classname => (
28 default => sub { "Parent" },
31 has type_constrained => (
45 has '+lazy_classname' => (
46 default => sub { "Child" },
49 has '+type_constrained' => (
55 my $foo = Parent->new;
56 my $bar = Parent->new;
58 is(blessed($foo), 'Parent', 'Parent->new gives a Parent object');
59 is($foo->name, undef, 'No name yet');
60 is($foo->lazy_classname, 'Parent', "lazy attribute initialized");
61 is( exception { $foo->type_constrained(10.5) }, undef, "Num type constraint for now.." );
63 # try to rebless, except it will fail due to Child's stricter type constraint
64 like( exception { Child->meta->rebless_instance($foo) }, qr/^Attribute \(type_constrained\) does not pass the type constraint because\: Validation failed for 'Int' with value 10\.5/, '... this failed cause of type check' );
65 like( exception { Child->meta->rebless_instance($bar) }, qr/^Attribute \(type_constrained\) does not pass the type constraint because\: Validation failed for 'Int' with value 5\.5/, '... this failed cause of type check' );
67 $foo->type_constrained(10);
68 $bar->type_constrained(5);
70 Child->meta->rebless_instance($foo);
71 Child->meta->rebless_instance($bar);
73 is(blessed($foo), 'Child', 'successfully reblessed into Child');
74 is($foo->name, 'Junior', "Child->name's default came through");
76 is($foo->lazy_classname, 'Parent', "lazy attribute was already initialized");
77 is($bar->lazy_classname, 'Child', "lazy attribute just now initialized");
79 like( exception { $foo->type_constrained(10.5) }, qr/^Attribute \(type_constrained\) does not pass the type constraint because\: Validation failed for 'Int' with value 10\.5/, '... this failed cause of type check' );