use strict;
use warnings;
-use Mouse;
-use Test::More tests => 14;
+use Mouse ();
+use Test::More tests => 23;
use Test::Exception;
# error handling
throws_ok {
Mouse::Meta::Class->create(
+ "ClassName",
superclasses => "foo"
);
} qr/You must pass an ARRAY ref of superclasses/;
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/;
-
-throws_ok {
- Mouse::Meta::Class->create()
-} qr/You must pass a package name/;
-
# normal cases
isa_ok(Mouse::Meta::Class->create("FooBar"), "Mouse::Meta::Class");
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 => {
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" ],
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';
+
+my $obj;
+{
+ my $anon = Mouse::Meta::Class->create_anon_class(superclasses => ['Mouse::Object']);
+ lives_ok{ $anon->make_immutable() } 'make anon class immutable';
+ $obj = $anon->name->new();
+}
+
+SKIP:{
+ skip 'Moose has a bug', 3 if 'Mouse' eq 'Moose';
+
+ isa_ok $obj, 'Mouse::Object';
+ can_ok $obj, 'meta';
+ lives_and{
+ isa_ok $obj->meta, 'Mouse::Meta::Class';
+ };
}