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