tiny change in metaclass.pm to automatically load custom metaclass
[gitmo/Class-MOP.git] / t / 006_new_and_clone_metaclasses.t
CommitLineData
2a7575a6 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
95514cb4 6use FindBin;
7use File::Spec::Functions;
8
a740253a 9use Test::More tests => 36;
2a7575a6 10use Test::Exception;
11
12BEGIN {
13 use_ok('Class::MOP');
14}
15
95514cb4 16use lib catdir($FindBin::Bin, 'lib');
17
2a7575a6 18# make sure the Class::MOP::Class->meta does the right thing
19
20my $meta = Class::MOP::Class->meta();
21isa_ok($meta, 'Class::MOP::Class');
22
c23184fc 23my $new_meta = $meta->new_object('package' => 'Class::MOP::Class');
2a7575a6 24isa_ok($new_meta, 'Class::MOP::Class');
25is($new_meta, $meta, '... it still creates the singleton');
26
27my $cloned_meta = $meta->clone_object($meta);
28isa_ok($cloned_meta, 'Class::MOP::Class');
95514cb4 29is($cloned_meta, $meta, '... it creates the singleton even if you try to clone it');
2a7575a6 30
31# make sure other metaclasses do the right thing
32
33{
34 package Foo;
35 use metaclass;
36}
37
38my $foo_meta = Foo->meta;
39isa_ok($foo_meta, 'Class::MOP::Class');
40
c23184fc 41is($meta->new_object('package' => 'Foo'), $foo_meta, '... got the right Foo->meta singleton');
2a7575a6 42is($meta->clone_object($foo_meta), $foo_meta, '... cloning got the right Foo->meta singleton');
2a7575a6 43
95514cb4 44# make sure subclassed of Class::MOP::Class do the right thing
2a7575a6 45
46my $my_meta = MyMetaClass->meta;
47isa_ok($my_meta, 'Class::MOP::Class');
48
c23184fc 49my $new_my_meta = $my_meta->new_object('package' => 'MyMetaClass');
2a7575a6 50isa_ok($new_my_meta, 'Class::MOP::Class');
51is($new_my_meta, $my_meta, '... even subclasses still create the singleton');
52
53my $cloned_my_meta = $meta->clone_object($my_meta);
54isa_ok($cloned_my_meta, 'Class::MOP::Class');
55is($cloned_my_meta, $my_meta, '... and subclasses creates the singleton even if you try to clone it');
56
c23184fc 57is($my_meta->new_object('package' => 'Foo'), $foo_meta, '... got the right Foo->meta singleton (w/subclass)');
2a7575a6 58is($meta->clone_object($foo_meta), $foo_meta, '... cloning got the right Foo->meta singleton (w/subclass)');
59
60# now create a metaclass for real
61
c23184fc 62my $bar_meta = $my_meta->new_object('package' => 'Bar');
2a7575a6 63isa_ok($bar_meta, 'Class::MOP::Class');
64
65is($bar_meta->name, 'Bar', '... got the right name for the Bar metaclass');
66is($bar_meta->version, undef, '... Bar does not exists, so it has no version');
67
68$bar_meta->superclasses('Foo');
69
95514cb4 70# check with MyMetaClass
2a7575a6 71
72{
73 package Baz;
74 use metaclass 'MyMetaClass';
75}
76
77my $baz_meta = Baz->meta;
78isa_ok($baz_meta, 'Class::MOP::Class');
79isa_ok($baz_meta, 'MyMetaClass');
80
c23184fc 81is($my_meta->new_object('package' => 'Baz'), $baz_meta, '... got the right Baz->meta singleton');
2a7575a6 82is($my_meta->clone_object($baz_meta), $baz_meta, '... cloning got the right Baz->meta singleton');
83
526ba574 84$baz_meta->superclasses('Bar');
85
2a7575a6 86# now create a regular objects for real
87
88my $foo = $foo_meta->new_object();
89isa_ok($foo, 'Foo');
90
91my $bar = $bar_meta->new_object();
92isa_ok($bar, 'Bar');
93isa_ok($bar, 'Foo');
94
5659d76e 95my $baz = $baz_meta->new_object();
96isa_ok($baz, 'Baz');
97isa_ok($baz, 'Bar');
98isa_ok($baz, 'Foo');
99
2a7575a6 100my $cloned_foo = $foo_meta->clone_object($foo);
101isa_ok($cloned_foo, 'Foo');
102
103isnt($cloned_foo, $foo, '... $cloned_foo is a new object different from $foo');
104
105# check some errors
106
107dies_ok {
108 $foo_meta->clone_object($meta);
95514cb4 109} '... this dies as expected';
2a7575a6 110
a740253a 111# test stuff
112
113{
114 package FooBar;
115 use metaclass;
95514cb4 116
a740253a 117 FooBar->meta->add_attribute('test');
118}
119
120my $attr = FooBar->meta->get_attribute('test');
121isa_ok($attr, 'Class::MOP::Attribute');
122
123my $attr_clone = $attr->clone();
124isa_ok($attr_clone, 'Class::MOP::Attribute');
125
126isnt($attr, $attr_clone, '... we successfully cloned our attributes');
95514cb4 127is($attr->associated_class,
128 $attr_clone->associated_class,
a740253a 129 '... we successfully did not clone our associated metaclass');
130