requires 'Moose' => '1.03';
requires 'MooseX::MethodAttributes::Inheritable' => '0.19';
requires 'MooseX::Role::WithOverloading' => '0.05';
+requires 'MooseX::Types::LoadableClass' => '0.003';
requires 'Carp';
requires 'Class::C3::Adopt::NEXT' => '0.07';
requires 'CGI::Simple::Cookie' => '1.109';
use Class::C3::Adopt::NEXT;
use List::MoreUtils qw/uniq/;
use attributes;
+use String::RewritePrefix;
use utf8;
use Carp qw/croak carp shortmess/;
use Try::Tiny;
unless ($engine) {
$engine = $class->engine_class;
}
- $engine = 'Catalyst::Engine::' . $engine
- unless $engine =~ /^Catalyst::Engine/;
+ else {
+ $engine = String::RewritePrefix->rewrite( { '' => 'Catalyst::Engine::', '+' => '' }, $engine );
+ }
$engine = 'Catalyst::Engine' if $engine eq 'Catalyst::Engine::HTTP';
);
}
+ if ($ENV{MOD_PERL}) {
+ # FIXME - Immutable
+ $class->meta->add_method(handler => sub { shift->handle_request(@_) });
+ }
+
$class->engine( $engine->new );
$class->psgi_app( $class->engine->build_psgi_app($class) );
}
--- /dev/null
+package Catalyst::Engine::Loader;
+use Moose;
+use Catalyst::Exception;
+use namespace::autoclean;
+
+extends 'Plack::Loader';
+
+around guess => sub {
+ my ($orig, $self) = (shift, shift);
+ my $engine = $self->$orig(@_);
+ if ($engine eq 'Standalone') {
+ if ( $ENV{MOD_PERL} ) {
+ my ( $software, $version ) =
+ $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
+
+ $version =~ s/_//g;
+ if ( $software eq 'mod_perl' ) {
+ if ( $version >= 1.99922 ) {
+ $engine = 'Apache2';
+ }
+
+ elsif ( $version >= 1.9901 ) {
+ Catalyst::Exception->throw( message => 'Plack does not have a mod_perl 1.99 handler' );
+ $engine = 'Apache2::MP19';
+ }
+
+ elsif ( $version >= 1.24 ) {
+ $engine = 'Apache1';
+ }
+
+ else {
+ Catalyst::Exception->throw( message =>
+ qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
+ }
+ }
+ }
+ }
+ return $engine;
+};
+
+__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
+1;
use MooseX::Types::Moose qw/Str Bool/;
use Pod::Usage;
use MooseX::Getopt;
-use Plack::Loader;
+use Catalyst::Engine::Loader;
+use MooseX::Types::LoadableClass qw/LoadableClass/;
use namespace::autoclean;
with 'MooseX::Getopt' => {
cmd_aliases => ['?', 'h'],
);
+has loader_class => (
+ isa => LoadableClass,
+ is => 'ro',
+ coerce => 1,
+ default => 'Catalyst::Engine::Loader',
+ documentation => 'The class to use to detect and load the PSGI engine',
+);
+
+has _loader => (
+ isa => 'Plack::Loader',
+ default => sub {
+ shift->loader_class->new
+ },
+ handles => {
+ load_engine => 'load',
+ autoload_engine => 'auto',
+ },
+ lazy => 1,
+);
+
sub _getopt_spec_exception {}
sub _getopt_spec_warnings {
Class::MOP::load_class($app);
my $server;
if (my $e = $self->can('_plack_engine_name') ) {
- $server = Plack::Loader->load($self->$e, $self->_plack_loader_args);
+ $server = $self->load_engine($self->$e, $self->_plack_loader_args);
}
else {
- $server = Plack::Loader->auto($self->_plack_loader_args);
+ $server = $self->autoload_engine($self->_plack_loader_args);
}
$app->run($self->_application_args, $server);
}