--- /dev/null
+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', coerce => 1 );
+}
+
+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";
+
+