If a class makes itself immutable and turns off constructor inlining, die with an...
Dave Rolsky [Tue, 28 Apr 2009 22:46:51 +0000 (22:46 +0000)]
lib/Catalyst.pm
t/plugin_new_method_backcompat.t

index 28a2baa..67caa15 100644 (file)
@@ -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));
 
index 74e8f10..7edabfc 100644 (file)
@@ -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';
+