use strict; use warnings; use Test::More tests => 4; use Mouse::Util::TypeConstraints; subtype 'Foo', as 'Object', where { $_->isa('A') }; { package A; use Mouse; has data => ( is => 'rw', isa => 'Str' ); } { package C; use Mouse; has a => ( is => 'rw', isa => 'Foo' ); } isa_ok(C->new(a => A->new()), 'C'); C->meta->make_immutable; isa_ok(C->new(a => A->new()), 'C'); # The BUILD invocation order used to get reversed after # making a class immutable. This checks it is correct. { package D; use Mouse; # we'll keep has order => (is => 'ro', default => sub {[]}); sub BUILD { push @{shift->order}, 'D' } package E; use Mouse; extends 'D'; sub BUILD { push @{shift->order}, 'E' } package F; use Mouse; extends 'E'; sub BUILD { push @{shift->order}, 'F' } } my $obj = F->new; print join(", ", @{$obj->order}),"\n"; is_deeply $obj->order, [qw(D E F)], "mutable BUILD invocation order correct"; # now make the classes immutable $_->meta->make_immutable for qw(D E F); my $obj2 = F->new; print join(", ", @{$obj2->order}),"\n"; is_deeply $obj2->order, [qw(D E F)], "immutable BUILD invocation order still correct";