Merge branch 'stable'
[gitmo/Class-MOP.git] / t / 040_metaclass.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5
6 use metaclass;
7
8 {
9     package FooMeta;
10     use base 'Class::MOP::Class';
11
12     package Foo;
13     use metaclass 'FooMeta';
14 }
15
16 can_ok('Foo', 'meta');
17 isa_ok(Foo->meta, 'FooMeta');
18 isa_ok(Foo->meta, 'Class::MOP::Class');
19
20 {
21     package BarMeta;
22     use base 'Class::MOP::Class';
23
24     package BarMeta::Attribute;
25     use base 'Class::MOP::Attribute';
26
27     package BarMeta::Method;
28     use base 'Class::MOP::Method';
29
30     package Bar;
31     use metaclass 'BarMeta' => (
32         'attribute_metaclass' => 'BarMeta::Attribute',
33         'method_metaclass'    => 'BarMeta::Method',
34     );
35 }
36
37 can_ok('Bar', 'meta');
38 isa_ok(Bar->meta, 'BarMeta');
39 isa_ok(Bar->meta, 'Class::MOP::Class');
40
41 is(Bar->meta->attribute_metaclass, 'BarMeta::Attribute', '... got the right attribute metaobject');
42 is(Bar->meta->method_metaclass, 'BarMeta::Method', '... got the right method metaobject');
43
44 {
45     package Baz;
46     use metaclass;
47 }
48
49 can_ok('Baz', 'meta');
50 isa_ok(Baz->meta, 'Class::MOP::Class');
51
52 eval {
53     package Boom;
54     metaclass->import('Foo');
55 };
56 ok($@, '... metaclasses must be subclass of Class::MOP::Class');
57
58 done_testing;