X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FScriptRole.pm;h=b1ddc27ae05da5f2ef5ae55494eb15bb2f475f1a;hb=f831720babc4818823ec8628dcc1bd032ed8220c;hp=bef547af8257b1fbf082c4feb18c1a639de0170f;hpb=2b8d5598d6da39d06250d3dac182d5b0e4684384;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/ScriptRole.pm b/lib/Catalyst/ScriptRole.pm index bef547a..b1ddc27 100644 --- a/lib/Catalyst/ScriptRole.pm +++ b/lib/Catalyst/ScriptRole.pm @@ -1,12 +1,20 @@ package Catalyst::ScriptRole; use Moose::Role; -use MooseX::Types::Moose qw/Str Bool/; use Pod::Usage; use MooseX::Getopt; +use Catalyst::EngineLoader; +use Moose::Util::TypeConstraints; +use Catalyst::Utils qw/ ensure_class_loaded /; use namespace::autoclean; +subtype 'Catalyst::ScriptRole::LoadableClass', + as 'ClassName'; +coerce 'Catalyst::ScriptRole::LoadableClass', + from 'Str', + via { ensure_class_loaded($_); 1 }; + with 'MooseX::Getopt' => { - excludes => [qw/ + -excludes => [qw/ _getopt_spec_warnings _getopt_spec_exception _getopt_full_usage @@ -14,17 +22,31 @@ with 'MooseX::Getopt' => { }; has application_name => ( - traits => ['NoGetopt'], - isa => Str, - is => 'ro', + traits => ['NoGetopt'], + isa => 'Str', + is => 'ro', required => 1, ); -has help => ( - traits => ['Getopt'], - isa => Bool, +has loader_class => ( + isa => 'Catalyst::ScriptRole::LoadableClass', is => 'ro', - documentation => q{Display this help and exit}, + coerce => 1, + default => 'Catalyst::EngineLoader', + documentation => 'The class to use to detect and load the PSGI engine', +); + +has _loader => ( + isa => 'Plack::Loader', + default => sub { + my $self = shift; + $self->loader_class->new(application_name => $self->application_name); + }, + handles => { + load_engine => 'load', + autoload_engine => 'auto', + }, + lazy => 1, ); sub _getopt_spec_exception {} @@ -40,25 +62,39 @@ sub _getopt_full_usage { exit 0; } -before run => sub { - my $self = shift; - $self->_getopt_full_usage if $self->help; -}; - sub run { my $self = shift; $self->_run_application; } sub _application_args { - () + my $self = shift; + return { + argv => $self->ARGV, + extra_argv => $self->extra_argv, + } +} + +sub _plack_loader_args { + my $self = shift; + my @app_args = $self->_application_args; + return (port => $app_args[0]); } +sub _plack_engine_name {} + sub _run_application { my $self = shift; my $app = $self->application_name; Class::MOP::load_class($app); - $app->run($self->_application_args); + my $server; + if (my $e = $self->_plack_engine_name ) { + $server = $self->load_engine($e, $self->_plack_loader_args); + } + else { + $server = $self->autoload_engine($self->_plack_loader_args); + } + $app->run($self->_application_args, $server); } 1; @@ -73,9 +109,9 @@ Catalyst::ScriptRole - Common functionality for Catalyst scripts. use Moose; use namespace::autoclean; - with 'Catalyst::Script::Role'; + with 'Catalyst::ScriptRole'; - sub _application_args { ... } + sub _application_args { ... } =head1 DESCRIPTION @@ -109,4 +145,3 @@ This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut -