File Coverage

blib/lib/Catalyst/EngineLoader.pm
Criterion Covered Total %
statement 19 22 86.3
branch 5 8 62.5
condition 1 3 33.3
subroutine 6 6 100.0
pod 0 1 0.0
total 31 40 77.5


line stmt bran cond sub pod time code
1             package Catalyst::EngineLoader;
2 176     176   69869 use Moose;
  176         471385  
  176         1998  
3 176     176   1305416 use Catalyst::Exception;
  176         768  
  176         5376  
4 176     176   4850 use Catalyst::Utils;
  176         589  
  176         6943  
5 176     176   1248 use namespace::clean -except => ['meta'];
  176         516  
  176         2421  
6              
7             extends 'Plack::Loader';
8              
9             has application_name => (
10             isa => 'Str',
11             is => 'ro',
12             required => 1,
13             );
14              
15             has requested_engine => (
16             is => 'ro',
17             isa => 'Str',
18             predicate => 'has_requested_engine',
19             );
20              
21             sub needs_psgi_engine_compat_hack {
22 3     3 0 25 my ($self) = @_;
23 3   33     180 return $self->has_requested_engine
24             && $self->requested_engine eq 'PSGI';
25             }
26              
27             has catalyst_engine_class => (
28             isa => 'Str',
29             is => 'rw',
30             lazy => 1,
31             builder => '_guess_catalyst_engine_class',
32             );
33              
34             sub _guess_catalyst_engine_class {
35 167     167   688 my $self = shift;
36 167 50       7440 my $old_engine = $self->has_requested_engine
37             ? $self->requested_engine
38             : Catalyst::Utils::env_value($self->application_name, 'ENGINE');
39 167 100       1159 if (!defined $old_engine) {
    50          
    50          
40 164         6172 return 'Catalyst::Engine';
41             }
42             elsif ($old_engine eq 'PSGI') {
43             ## If we are running under plackup let the Catalyst::Engine::PSGI
44             ## continue to run, but warn.
45 0         0 warn <<"EOW";
46             You are running Catalyst::Engine::PSGI, which is considered a legacy engine for
47             this version of Catalyst. We will continue running and use your existing psgi
48             file, but it is recommended to perform the trivial upgrade process, which will
49             leave you with less code and a forward path.
50              
51             Please review Catalyst::Upgrading
52             EOW
53 0         0 return 'Catalyst::Engine::' . $old_engine;
54             }
55             elsif ($old_engine =~ /^(CGI|FastCGI|HTTP|Apache.*)$/) {
56 3         100 return 'Catalyst::Engine';
57             }
58             else {
59 0           return 'Catalyst::Engine::' . $old_engine;
60             }
61             }
62              
63             around guess => sub {
64             my ($orig, $self) = (shift, shift);
65             my $engine = $self->$orig(@_);
66             if ( $ENV{MOD_PERL} ) {
67             my ( $software, $version ) =
68             $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
69             $version =~ s/_//g;
70             $version =~ s/(\.[^.]+)\./$1/g;
71              
72             if ( $software eq 'mod_perl' ) {
73             if ( $version >= 1.99922 ) {
74             $engine = 'Apache2';
75             }
76              
77             elsif ( $version >= 1.9901 ) {
78             Catalyst::Exception->throw( message => 'Plack does not have a mod_perl 1.99 handler' );
79             $engine = 'Apache2::MP19';
80             }
81              
82             elsif ( $version >= 1.24 ) {
83             $engine = 'Apache1';
84             }
85              
86             else {
87             Catalyst::Exception->throw( message =>
88             qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
89             }
90             }
91             }
92              
93             my $old_engine = Catalyst::Utils::env_value($self->application_name, 'ENGINE');
94             if (!defined $old_engine) { # Not overridden
95             }
96             elsif ($old_engine =~ /^(PSGI|CGI|Apache.*)$/) {
97             # Trust autodetect
98             }
99             elsif ($old_engine eq 'HTTP') {
100             $engine = 'Standalone';
101             }
102             elsif ($old_engine eq 'FastCGI') {
103             $engine = 'FCGI';
104             }
105             elsif ($old_engine eq "HTTP::Prefork") { # Too bad if you're customising, we don't handle options
106             # write yourself a script to collect and pass in the options
107             $engine = "Starman";
108             }
109             elsif ($old_engine eq "HTTP::POE") {
110             Catalyst::Exception->throw("HTTP::POE engine no longer works, recommend you use Twiggy instead");
111             }
112             elsif ($old_engine eq "Zeus") {
113             Catalyst::Exception->throw("Zeus engine no longer works");
114             }
115             else {
116             warn("You asked for an unrecognised engine '$old_engine' which is no longer supported, this has been ignored.\n");
117             }
118              
119             return $engine;
120             };
121              
122             # Force constructor inlining
123             __PACKAGE__->meta->make_immutable( replace_constructor => 1 );
124              
125             1;
126              
127             __END__
128              
129             =head1 NAME
130              
131             Catalyst::EngineLoader - The Catalyst Engine Loader
132              
133             =head1 SYNOPSIS
134              
135             See L<Catalyst>.
136              
137             =head1 DESCRIPTION
138              
139             Wrapper on L<Plack::Loader> which resets the ::Engine if you are using some
140             version of mod_perl.
141              
142             =head1 AUTHORS
143              
144             Catalyst Contributors, see Catalyst.pm
145              
146             =head1 COPYRIGHT
147              
148             This library is free software. You can redistribute it and/or modify it under
149             the same terms as Perl itself.
150              
151             =begin Pod::Coverage
152              
153             needs_psgi_engine_compat_hack
154              
155             =end Pod::Coverage
156              
157             =cut