B::Hooks::EndOfScope::on_scope_end {
my $meta = Class::MOP::get_metaclass_by_name($class);
if ( $meta->is_immutable && ! { $meta->immutable_options }->{inline_constructor} ) {
- die "You made your application class ($class) immutable, "
+ warn "You made your application class ($class) immutable, "
. "but did not inline the constructor.\n"
. "This will break catalyst, please pass "
. "(replace_constructor => 1) when making your class immutable.\n";
--- /dev/null
+package TestAppBadlyImmutable;
+use Catalyst qw/+TestPluginWithConstructor/;
+use Test::More;
+
+__PACKAGE__->setup;
+
+ok !__PACKAGE__->meta->is_immutable, 'Am not already immutable';
+__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
+ok __PACKAGE__->meta->is_immutable, 'Am now immutable';
+
+1;
+
# that plugins don't get it wrong for us.
# Also tests method modifiers and etc in MyApp.pm still work as expected.
-use Test::More tests => 6;
+use Test::More tests => 8;
use Test::Exception;
use Moose::Util qw/find_meta/;
use FindBin;
ok request('/foo')->is_success, 'Can get /foo';
is $TestAppPluginWithConstructor::MODIFIER_FIRED, 1, 'Before modifier was fired correctly.';
-throws_ok {
- package TestAppBadlyImmutable;
- use Catalyst qw/+TestPluginWithConstructor/;
-
- TestAppBadlyImmutable->setup;
-
- __PACKAGE__->meta->make_immutable( inline_constructor => 0 );
-}
- qr/\QYou made your application class (TestAppBadlyImmutable) immutable/,
- 'An application class that is already immutable but does not inline the constructor dies at ->setup';
+my $warning;
+local $SIG{__WARN__} = sub { $warning = $_[0] };
+eval "use TestAppBadlyImmutable;";
+like $warning, qr/\QYou made your application class (TestAppBadlyImmutable) immutable/,
+ 'An application class that is already immutable but does not inline the constructor warns at ->setup';