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