use strict;
use warnings;
use Test::More;
use Test::Requires 'Test::Output'; # skip all if not installed
{
package NotMoose;
sub new {
my $class = shift;
return bless { not_moose => 1 }, $class;
}
}
{
package Foo;
use Moose;
extends 'NotMoose';
::stderr_like(
sub { Foo->meta->make_immutable },
qr/\QNot inlining 'new' for Foo since it is not inheriting the default Moose::Object::new\E\s+\QIf you are certain you don't need to inline your constructor, specify inline_constructor => 0 in your call to Foo->meta->make_immutable/,
'got a warning that Foo may not have an inlined constructor'
);
}
is(
Foo->meta->find_method_by_name('new')->body,
NotMoose->can('new'),
'Foo->new is inherited from NotMoose'
);
{
package Bar;
use Moose;
extends 'NotMoose';
::stderr_is(
sub { Bar->meta->make_immutable( replace_constructor => 1 ) },
q{},
'no warning when replace_constructor is true'
);
}
is(
Bar->meta->find_method_by_name('new')->package_name,
'Bar',
'Bar->new is inlined, and not inherited from NotMoose'
);
{
package Baz;
use Moose;
Baz->meta->make_immutable;
}
{
package Quux;
use Moose;
extends 'Baz';
::stderr_is(
sub { Quux->meta->make_immutable },
q{},
'no warning when inheriting from a class that has already made itself immutable'
);
}
{
package My::Constructor;
use parent 'Moose::Meta::Method::Constructor';
}
{
package CustomCons;
use Moose;
CustomCons->meta->make_immutable( constructor_class => 'My::Constructor' );
}
{
package Subclass;
use Moose;
extends 'CustomCons';
::stderr_is(
sub { Subclass->meta->make_immutable },
q{},
'no warning when inheriting from a class that has already made itself immutable'
);
}
done_testing;