280af2648df6377ad44c2c6fb41dda1c6e8a1cf9
[gitmo/Moose.git] / t / 100_bugs / 018_immutable_metaclass_does_role.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 5;
7 use Test::Exception;
8
9 BEGIN {
10     use_ok('Moose');
11 }
12
13 BEGIN {
14     package MyRole;
15     use Moose::Role;
16
17     requires 'foo';
18
19     package MyMetaclass;
20     use Moose qw(extends with);
21     extends 'Moose::Meta::Class';
22        with 'MyRole';
23         
24     sub foo { 'i am foo' }        
25 }
26
27 {
28     package MyClass;
29     use metaclass ('MyMetaclass');
30     use Moose;
31 }
32
33 my $mc = MyMetaclass->initialize('MyClass');
34 isa_ok($mc, 'MyMetaclass');
35
36 ok($mc->meta->does_role('MyRole'), '... the metaclass does the role');
37
38 is(MyClass->meta, $mc, '... these metas are the same thing');
39 is(MyClass->meta->meta, $mc->meta, '... these meta-metas are the same thing');
40
41 my $a = MyClass->new;
42 ok( $a->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
43 ok( MyClass->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
44
45 diag join ", " => map { $_->name } @{$mc->meta->roles};
46 diag join ", " => map { $_->name } $mc->meta->calculate_all_roles;
47
48 lives_ok {
49     MyClass->meta->make_immutable;
50 } '... make MyClass immutable okay';
51
52 diag join ", " => map { $_->name } @{$mc->meta->roles};
53 diag join ", " => map { $_->name } $mc->meta->calculate_all_roles;
54
55 is(MyClass->meta, $mc, '... these metas are still the same thing');
56 is(MyClass->meta->meta, $mc->meta, '... these meta-metas are the same thing');
57
58 ok( $a->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
59 ok( MyClass->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
60
61 =pod
62
63 MyClass->meta->make_mutable;
64 ok( $a->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
65
66 MyMetaclass->meta->make_immutable;
67 ok( $a->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
68
69 MyClass->meta->make_immutable;
70 ok( $a->meta->meta->does_role('MyRole'), 'metaclass does MyRole' );
71