1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
use strict;
use warnings;
use Test::More tests => 25;
use Test::Exception;
use Mouse ();
# 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/;
# normal cases
isa_ok(Mouse::Meta::Class->create("FooBar"), "Mouse::Meta::Class");
is FooBar->meta->name, "FooBar";
isa_ok(
Mouse::Meta::Class->create(
"Baz",
superclasses => [ "FooBar", "Mouse::Object" ],
attributes => [
Mouse::Meta::Attribute->new(
"foo" => (
is => "rw",
default => "yay",
),
)
],
methods => {
dooo => sub { "iiiit" },
}
),
"Mouse::Meta::Class"
);
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" ],
methods => {
dooo => sub { "iiiit" },
}
);
$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(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 $anon = Mouse::Meta::Class->create_anon_class(
constructor_class => 'ConstructorX',
destructor_class => 'DestructorX',
);
is $anon->constructor_class, 'ConstructorX';
is $anon->destructor_class, 'DestructorX';
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';
};
}
|