From: Dave Rolsky Date: Tue, 28 Apr 2009 22:46:51 +0000 (+0000) Subject: If a class makes itself immutable and turns off constructor inlining, die with an... X-Git-Tag: 5.80003~10 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=6e5505d4891660b3ec52547ca1915bb84f23af57 If a class makes itself immutable and turns off constructor inlining, die with an error telling them to turn on replace_constructor => 1 --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 28a2baa..67caa15 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -1101,6 +1101,12 @@ EOF # applying modifiers). Scope::Upper::reap(sub { 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, " + . "but did not inline the constructor.\n" + . "This will break catalyst, please pass " + . "(replace_constructor => 1) when making your class immutable.\n"; + } $meta->make_immutable(replace_constructor => 1) unless $meta->is_immutable; }, Scope::Upper::SCOPE(1)); diff --git a/t/plugin_new_method_backcompat.t b/t/plugin_new_method_backcompat.t index 74e8f10..7edabfc 100644 --- a/t/plugin_new_method_backcompat.t +++ b/t/plugin_new_method_backcompat.t @@ -8,7 +8,8 @@ # 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 => 3; +use Test::More tests => 4; +use Test::Exception; { package NewTestPlugin; @@ -50,3 +51,15 @@ use lib "$FindBin::Bin/lib"; use Catalyst::Test qw/TestAppPluginWithNewMethod/; ok request('/foo')->is_success; is $TestAppPluginWithNewMethod::MODIFIER_FIRED, 1, 'Before modifier was fired correctly.'; + +throws_ok { + package TestAppBadlyImmutable; + use Catalyst qw/+NewTestPlugin/; + + 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'; +