Fix custom engine compat
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index bdb37bf..a4278fd 100644 (file)
@@ -84,7 +84,7 @@ __PACKAGE__->stats_class('Catalyst::Stats');
 
 # Remember to update this in Catalyst::Runtime as well!
 
-our $VERSION = '5.89002';
+our $VERSION = '5.89003';
 
 sub import {
     my ( $class, @arguments ) = @_;
@@ -2603,35 +2603,45 @@ Sets up engine.
 =cut
 
 sub engine_class {
-    my $class = shift;
-    $class->engine_loader->catalyst_engine_class(@_);
+    my ($class, $requested_engine) = @_;
+
+    if (!$class->engine_loader || $requested_engine) {
+        $class->engine_loader(
+            Catalyst::EngineLoader->new({
+                application_name => $class,
+                (defined $requested_engine
+                     ? (requested_engine => $requested_engine) : ()),
+            }),
+        );
+    }
+    $class->engine_loader->catalyst_engine_class;
 }
 
 sub setup_engine {
     my ($class, $requested_engine) = @_;
 
-    $class->engine_loader(
-        Catalyst::EngineLoader->new({
-            application_name => $class,
-            (defined $requested_engine
-                 ? (requested_engine => $requested_engine) : ()),
-        }),
-    );
+    my $engine = $class->engine_class($requested_engine);
 
     # Don't really setup_engine -- see _setup_psgi_app for explanation.
     return if $class->loading_psgi_file;
 
-    my $engine = $class->engine_class;
     Class::MOP::load_class($engine);
 
     if ($ENV{MOD_PERL}) {
         my $apache = $class->engine_loader->auto;
-        # FIXME - Immutable
-        $class->meta->add_method(handler => sub {
+
+        my $meta = find_meta($class);
+        my $was_immutable = $meta->is_immutable;
+        my %immutable_options = $meta->immutable_options;
+        $meta->make_mutable if $was_immutable;
+
+        $meta->add_method(handler => sub {
             my $r = shift;
             my $psgi_app = $class->psgi_app;
             $apache->call_app($r, $psgi_app);
         });
+
+        $meta->make_immutable(%immutable_options) if $was_immutable;
     }
 
     $class->engine( $engine->new );