Make anonymous classes work correctly
[gitmo/Mouse.git] / t / 800_shikabased / 008-create_class.t
index 99143f3..687671e 100644 (file)
@@ -1,12 +1,13 @@
 use strict;
 use warnings;
 use Mouse ();
-use Test::More tests => 14;
+use Test::More tests => 20;
 use Test::Exception;
 
 # error handling
 throws_ok {
     Mouse::Meta::Class->create(
+        "ClassName",
         superclasses => "foo"
     );
 } qr/You must pass an ARRAY ref of superclasses/;
@@ -14,12 +15,14 @@ throws_ok {
 
 throws_ok {
     Mouse::Meta::Class->create(
+        "ClassName",
         attributes => "foo"
     );
 } qr/You must pass an ARRAY ref of attributes/;
 
 throws_ok {
     Mouse::Meta::Class->create(
+        "ClassName",
         methods => "foo"
     );
 } qr/You must pass a HASH ref of methods/;
@@ -35,11 +38,14 @@ is FooBar->meta->name, "FooBar";
 
 isa_ok(
     Mouse::Meta::Class->create(
-        package      => "Baz",
+        "Baz",
         superclasses => [ "FooBar", "Mouse::Object" ],
         attributes   => [
             Mouse::Meta::Attribute->new(
-                name => "foo", is => "rw", default => "yay"
+                "foo" => (
+                    is => "rw",
+                    default => "yay",
+                ),
             )
         ],
         methods => {
@@ -52,6 +58,7 @@ isa_ok Baz->new(), "FooBar";
 is Baz->new()->foo, "yay";
 is Baz->new()->dooo, "iiiit";
 
+my($anon_pkg1, $anon_pkg2);
 {
     my $meta = Mouse::Meta::Class->create_anon_class(
         superclasses => [ "Mouse::Object" ],
@@ -59,10 +66,25 @@ is Baz->new()->dooo, "iiiit";
             dooo => sub { "iiiit" },
         }
     );
-    isa_ok($meta, "Mouse::Meta::Class");
-    is $meta->name, "Mouse::Meta::Class::__ANON__::SERIAL::1";
+    $anon_pkg1 = $meta->name;
+
+    isa_ok($meta, "Mouse::Meta::Class", 'create_anon_class');
+    ok($meta->is_anon_class, 'is_anon_class');
     is $meta->name->new->dooo(), "iiiit";
 
-    my $anon2 = Mouse::Meta::Class->create_anon_class();
-    is $anon2->name, "Mouse::Meta::Class::__ANON__::SERIAL::2";
+    my $anon2 = Mouse::Meta::Class->create_anon_class(cache => 1);
+    $anon_pkg2 = $anon2->name;
+
+    ok($anon2->is_anon_class);
+
+    isnt $meta, $anon2;
+    isnt $meta->name, $anon2->name;
 }
+
+# all the stuff are removed?
+ok !$anon_pkg1->isa('Mouse::Object');
+ok !$anon_pkg1->can('dooo');
+ok !$anon_pkg1->can('meta');
+
+ok $anon_pkg2->can('meta'), 'cache => 1 makes it immortal';
+