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