}
sub setup_engine {
- my ($class) = @_;
-
- $class->engine_loader(Catalyst::EngineLoader->new(application_name => $class));
+ my ($class, $compat_requested_engine) = @_;
+
+ $class->engine_loader(
+ Catalyst::EngineLoader->new({
+ application_name => $class,
+ (!defined $compat_requested_engine
+ ? ()
+ : (compat_options => {
+ requested_engine => $compat_requested_engine,
+ })),
+ }),
+ );
my $engine = $class->engine_class;
Class::MOP::load_class($engine);
sub _setup_psgi_app {
my ($app) = @_;
- if (my $home = Path::Class::Dir->new($app->config->{home})) {
+ for my $home (Path::Class::Dir->new($app->config->{home})) {
my $psgi_file = $home->file(
Catalyst::Utils::appprefix($app) . '.psgi',
);
- return Plack::Util::load_psgi($psgi_file)
- if -e $psgi_file;
+ next unless -e $psgi_file;
+ my $psgi_app = Plack::Util::load_psgi($psgi_file);
+
+ 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
+ warn <<"EOW";
+Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
+
+Its content has been ignored. Please consult the Catalyst::Upgrading
+documentation on how to upgrade from Catalyst::Engine::PSGI.
+EOW
}
return $app->_wrapped_legacy_psgi_app($app->psgi_app);
required => 1,
);
+has compat_options => (
+ traits => ['Hash'],
+ is => 'ro',
+ isa => 'HashRef',
+ default => sub { +{} },
+ handles => {
+ has_compat_option => 'exists',
+ compat_option => 'get',
+ },
+);
+
+sub needs_psgi_engine_compat_hack {
+ my ($self) = @_;
+ return $self->has_compat_option('requested_engine')
+ && $self->compat_option('requested_engine') eq 'PSGI';
+}
+
has catalyst_engine_class => (
isa => 'Str',
is => 'rw',
This library is free software. You can redistribute it and/or modify it under
the same terms as Perl itself.
+=begin Pod::Coverage
+
+needs_psgi_engine_compat_hack
+
+=end Pod::Coverage
+
=cut