Make anonymous classes work correctly
[gitmo/Mouse.git] / t / 800_shikabased / 008-create_class.t
CommitLineData
368e3d4a 1use strict;
2use warnings;
b6a2be43 3use Mouse ();
ad022aac 4use Test::More tests => 20;
368e3d4a 5use Test::Exception;
6
7# error handling
8throws_ok {
9 Mouse::Meta::Class->create(
475666e5 10 "ClassName",
368e3d4a 11 superclasses => "foo"
12 );
13} qr/You must pass an ARRAY ref of superclasses/;
14
15
16throws_ok {
17 Mouse::Meta::Class->create(
475666e5 18 "ClassName",
368e3d4a 19 attributes => "foo"
20 );
21} qr/You must pass an ARRAY ref of attributes/;
22
23throws_ok {
24 Mouse::Meta::Class->create(
475666e5 25 "ClassName",
368e3d4a 26 methods => "foo"
27 );
28} qr/You must pass a HASH ref of methods/;
29
30
31throws_ok {
32 Mouse::Meta::Class->create()
33} qr/You must pass a package name/;
34
35# normal cases
36isa_ok(Mouse::Meta::Class->create("FooBar"), "Mouse::Meta::Class");
37is FooBar->meta->name, "FooBar";
38
39isa_ok(
40 Mouse::Meta::Class->create(
1a72f15c 41 "Baz",
368e3d4a 42 superclasses => [ "FooBar", "Mouse::Object" ],
43 attributes => [
44 Mouse::Meta::Attribute->new(
2608b115 45 "foo" => (
46 is => "rw",
47 default => "yay",
48 ),
368e3d4a 49 )
50 ],
51 methods => {
52 dooo => sub { "iiiit" },
53 }
54 ),
55 "Mouse::Meta::Class"
56);
57isa_ok Baz->new(), "FooBar";
58is Baz->new()->foo, "yay";
59is Baz->new()->dooo, "iiiit";
60
ad022aac 61my($anon_pkg1, $anon_pkg2);
368e3d4a 62{
63 my $meta = Mouse::Meta::Class->create_anon_class(
64 superclasses => [ "Mouse::Object" ],
65 methods => {
66 dooo => sub { "iiiit" },
67 }
68 );
ad022aac 69 $anon_pkg1 = $meta->name;
70
71 isa_ok($meta, "Mouse::Meta::Class", 'create_anon_class');
72 ok($meta->is_anon_class, 'is_anon_class');
368e3d4a 73 is $meta->name->new->dooo(), "iiiit";
74
ad022aac 75 my $anon2 = Mouse::Meta::Class->create_anon_class(cache => 1);
76 $anon_pkg2 = $anon2->name;
77
78 ok($anon2->is_anon_class);
79
80 isnt $meta, $anon2;
81 isnt $meta->name, $anon2->name;
368e3d4a 82}
ad022aac 83
84# all the stuff are removed?
85ok !$anon_pkg1->isa('Mouse::Object');
86ok !$anon_pkg1->can('dooo');
87ok !$anon_pkg1->can('meta');
88
89ok $anon_pkg2->can('meta'), 'cache => 1 makes it immortal';
90