The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
{
# so we don't pick up stuff from Moose::Object
package Base::Class;
sub foo { } # touch it so that 'extends' doesn't try to load it
}
{
package Foo;
use Moose;
extends 'Base::Class';
no Moose;
}
can_ok('Foo', 'meta');
is(Foo->meta, Class::MOP::class_of('Foo'), 'Foo is a class_of Foo, via Foo->meta');
isa_ok(Foo->meta->get_method('meta'), 'Moose::Meta::Method::Meta');
{
package Bar;
use Moose -meta_name => 'bar_meta';
extends 'Base::Class';
no Moose;
}
ok(!Bar->can('meta'), q{Bar->cant('meta')});
can_ok('Bar', 'bar_meta');
is(Bar->bar_meta, Class::MOP::class_of('Bar'), 'Bar is a class_of Bar, via Bar->bar_meta');
isa_ok(Bar->bar_meta->get_method('bar_meta'), 'Moose::Meta::Method::Meta');
{
package Baz;
use Moose -meta_name => undef;
extends 'Base::Class';
no Moose;
}
ok(!Baz->can('meta'), q{Baz->cant('meta')});
my $universal_method_count = scalar Class::MOP::class_of('UNIVERSAL')->get_all_methods;
# 1 because of the dummy method we installed in Base
is(
( scalar Class::MOP::class_of('Baz')->get_all_methods ) - $universal_method_count,
1,
'Baz has one method',
);
{
package Qux;
use Moose -meta_name => 'qux_meta';
}
can_ok('Qux', 'qux_meta');
is(Qux->qux_meta, Class::MOP::class_of('Qux'), 'Qux is a class_of Qux, via Qux->qux_meta');
isa_ok(Qux->qux_meta->get_method('qux_meta'), 'Moose::Meta::Method::Meta');
{
package FooBar;
sub meta { 42 }
use Moose -meta_name => 'foo_bar_meta';
}
is(FooBar->meta, 42, 'FooBar->meta returns 42, not metaclass object');
{
package FooBar::Child;
use Moose -meta_name => 'foo_bar_child_meta';
extends 'FooBar';
}
is(FooBar::Child->meta, 42, 'FooBar::Child->meta returns 42, not metaclass object');
done_testing;