X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FScriptRole.pm;h=af8c636c74236eb8b610e64235295b13584024ab;hp=53432e3d5526148f7b187dbabe2e9e6e4ee9ecd4;hb=9c74923de2304b8c8f0a7a2faa0854ad9b4d3a92;hpb=111d3c9ac7830a54313687b3ef8cc0cfafbd3c1e diff --git a/lib/Catalyst/ScriptRole.pm b/lib/Catalyst/ScriptRole.pm index 53432e3..af8c636 100644 --- a/lib/Catalyst/ScriptRole.pm +++ b/lib/Catalyst/ScriptRole.pm @@ -2,35 +2,59 @@ package Catalyst::ScriptRole; use Moose::Role; use MooseX::Types::Moose qw/Str Bool/; use Pod::Usage; +use MooseX::Getopt; +use Catalyst::Engine::Loader; +use MooseX::Types::LoadableClass qw/LoadableClass/; use namespace::autoclean; -with 'MooseX::Getopt'; +with 'MooseX::Getopt' => { + -excludes => [qw/ + _getopt_spec_warnings + _getopt_spec_exception + _getopt_full_usage + /], +}; 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 => LoadableClass, is => 'ro', - documentation => q{Display this help and exit}, + coerce => 1, + default => 'Catalyst::Engine::Loader', + documentation => 'The class to use to detect and load the PSGI engine', ); -sub _exit_with_usage { +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 { + shift; + warn @_; +} + +sub _getopt_full_usage { my $self = shift; pod2usage(); exit 0; } -before run => sub { - my $self = shift; - $self->_exit_with_usage if $self->help; -}; - sub run { my $self = shift; $self->_run_application; @@ -40,32 +64,25 @@ sub _application_args { () } +sub _plack_loader_args { + my @app_args = shift->_application_args; + return (port => $app_args[0]); +} + 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->can('_plack_engine_name') ) { + $server = $self->load_engine($self->$e, $self->_plack_loader_args); + } + else { + $server = $self->autoload_engine($self->_plack_loader_args); + } + $app->run($self->_application_args, $server); } -# GROSS HACK, temporary until MX::Getopt gets some proper refactoring and unfucking.. -around '_parse_argv' => sub { - my ($orig, $self, @args) = @_; - my %data = eval { $self->$orig(@args) }; - $self->_exit_with_usage($@) if $@; - $data{usage} = Catalyst::ScriptRole::Useage->new(code => sub { shift; $self->_exit_with_usage(@_) }); - return %data; -}; - -# This package is going away. -package # Hide from PAUSE - Catalyst::ScriptRole::Useage; -use Moose; -use namespace::autoclean; - -has code => ( is => 'ro', required => 1 ); - -sub die { shift->code->(@_) } - 1; =head1 NAME @@ -78,9 +95,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 @@ -114,4 +131,3 @@ This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut -