From: Andrew Rodland Date: Thu, 21 Jul 2011 20:50:19 +0000 (-0400) Subject: Replace the setup_engine workaround with a better one X-Git-Tag: 5.89003~32 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=2e1f92a3602e2ff4bad339c31b5d459a0f5032f2 Replace the setup_engine workaround with a better one Instead of letting the .psgi setup_engine('PSGI') and then trying to undo the damage, add a flag that makes setup_engine not really load the requested engine if we're in the middle of loading a myapp.psgi --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 083c0af..2568fdd 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -75,7 +75,7 @@ our $GO = Catalyst::Exception::Go->new; __PACKAGE__->mk_classdata($_) for qw/components arguments dispatcher engine log dispatcher_class engine_loader context_class request_class response_class stats_class - setup_finished _psgi_app/; + setup_finished _psgi_app loading_psgi_file/; __PACKAGE__->dispatcher_class('Catalyst::Dispatcher'); __PACKAGE__->request_class('Catalyst::Request'); @@ -2618,6 +2618,9 @@ sub setup_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); @@ -2656,27 +2659,20 @@ sub _setup_psgi_app { ); next unless -e $psgi_file; + + # If $psgi_file calls ->setup_engine, it's doing so to load + # Catalyst::Engine::PSGI. But if it does that, we're only going to + # throw away the loaded PSGI-app and load the 5.9 Catalyst::Engine + # anyway. So set a flag (ick) that tells setup_engine not to populate + # $c->engine or do any other things we might regret. + + $app->loading_psgi_file(1); my $psgi_app = Plack::Util::load_psgi($psgi_file); + $app->loading_psgi_file(0); return $psgi_app unless $app->engine_loader->needs_psgi_engine_compat_hack; - # load_psgi ran a .psgi file doing ->setup_engine('PSGI'). That's what - # .psgi files generated by the old Engine::PSGI do. Those return an app - # coderef calling into MyApp->run, which doesn't work anymore, so we're - # just ignoring it and use the wrapped legacy psgi app - - $app->engine(undef); - $app->setup_engine; - - # ^^ We need to do this because even though we are discarded $psgi_app, the - # fact that it was loaded above means that Catalyst Engine now has the - # wrong value (PSGI), which persists due to the singleton nature of all - # this stuff. This solution is probably a lame hack but did work for all - # the cases we know about. Hopefully we can pull out this crap soon - # Please note that if the fact that the psgi file was loaded started to set - # values in areas outside Engine this hack will probably fail. - warn <<"EOW"; Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.