basic implementation of preserving attrs/methods across reinitialization
[gitmo/Class-MOP.git] / t / 049_metaclass_reinitialize.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Exception;
6
7 {
8     package Foo;
9     use metaclass;
10     sub foo {}
11     Foo->meta->add_attribute('bar');
12 }
13
14 sub check_meta_sanity {
15     my ($meta) = @_;
16     isa_ok($meta, 'Class::MOP::Class');
17     is($meta->name, 'Foo');
18     ok($meta->has_method('foo'));
19     ok($meta->has_attribute('bar'));
20 }
21
22 can_ok('Foo', 'meta');
23
24 my $meta = Foo->meta;
25 check_meta_sanity($meta);
26
27 lives_ok {
28     $meta = $meta->reinitialize($meta->name);
29 };
30 check_meta_sanity($meta);
31
32 lives_ok {
33     $meta = $meta->reinitialize($meta);
34 };
35 check_meta_sanity($meta);
36
37 throws_ok {
38     $meta->reinitialize('');
39 } qr/You must pass a package name or an existing Class::MOP::Package instance/;
40
41 throws_ok {
42     $meta->reinitialize($meta->new_object);
43 } qr/You must pass a package name or an existing Class::MOP::Package instance/;
44
45 done_testing;