Store the script options in the engine.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Script / Server.pm
index d587b4f..4e87191 100644 (file)
@@ -3,6 +3,7 @@ use Moose;
 use MooseX::Types::Common::Numeric qw/PositiveInt/;
 use MooseX::Types::Moose qw/ArrayRef Str Bool Int RegexpRef/;
 use Catalyst::Utils;
+use Try::Tiny;
 use namespace::autoclean;
 
 with 'Catalyst::ScriptRole';
@@ -46,18 +47,24 @@ has port => (
 
 use Moose::Util::TypeConstraints;
 class_type 'MooseX::Daemonize::Pid::File';
-subtype 'MyStr', as Str, where { 1 }; # FIXME - Fuck ugly!
-coerce 'MooseX::Daemonize::Pid::File', from 'MyStr', via {
-    Class::MOP::load_class("MooseX::Daemonize::Pid::File");
+subtype 'Catalyst::Script::Server::Types::Pidfile',
+    as 'MooseX::Daemonize::Pid::File';
+
+coerce 'Catalyst::Script::Server::Types::Pidfile', from Str, via {
+    try { Class::MOP::load_class("MooseX::Daemonize::Pid::File") }
+    catch {
+        warn("Could not load MooseX::Daemonize::Pid::File, needed for --pid option\n");
+        exit 1;
+    };
     MooseX::Daemonize::Pid::File->new( file => $_ );
 };
 MooseX::Getopt::OptionTypeMap->add_option_type_to_map(
-    'MooseX::Daemonize::Pid::File' => '=s',
+    'Catalyst::Script::Server::Types::Pidfile' => '=s',
 );
 has pidfile => (
     traits        => [qw(Getopt)],
     cmd_aliases   => 'pid',
-    isa           => 'MooseX::Daemonize::Pid::File',
+    isa           => 'Catalyst::Script::Server::Types::Pidfile',
     is            => 'ro',
     documentation => 'Specify a pidfile',
     coerce        => 1,
@@ -66,11 +73,14 @@ has pidfile => (
 
 sub BUILD {
     my $self = shift;
-    $self->pidfile->write
-        if $self->_has_pidfile;
+
     if ($self->background) {
         # FIXME - This is evil. Should we just add MX::Daemonize to the deps?
-        Class::MOP::load_class('MooseX::Daemonize::Core');
+        try { Class::MOP::load_class('MooseX::Daemonize::Core') }
+        catch {
+            warn("MooseX::Daemonize is needed for the --background option\n");
+            exit 1;
+        };
         MooseX::Daemonize::Core->meta->apply($self);
     }
 }
@@ -125,7 +135,7 @@ has restart_delay => (
 {
     use Moose::Util::TypeConstraints;
 
-    my $tc = subtype as RegexpRef;
+    my $tc = subtype 'Catalyst::Script::Server::Types::RegexpRef', as RegexpRef;
     coerce $tc, from Str, via { qr/$_/ };
 
     MooseX::Getopt::OptionTypeMap->add_option_type_to_map($tc => '=s');
@@ -153,7 +163,7 @@ has follow_symlinks => (
 
 sub _plack_engine_name {
     my $self = shift;
-    return $self->fork ? 'Starman' : $self->keepalive ? 'Starman' : 'Standalone';
+    return $self->fork || $self->keepalive ? 'Starman' : 'Standalone';
 }
 
 sub _restarter_args {
@@ -191,6 +201,8 @@ sub run {
     if ( $self->restart ) {
         die "Cannot run in the background and also watch for changed files.\n"
             if $self->background;
+        die "Cannot write out a pid file and fork for the restarter.\n"
+            if $self->_has_pidfile;
 
         # If we load this here, then in the case of a restarter, it does not
         # need to be reloaded for each restart.
@@ -221,6 +233,9 @@ sub run {
             $self->daemon_detach;
         }
 
+        $self->pidfile->write
+            if $self->_has_pidfile;
+
         $self->_run_application;
     }
 
@@ -245,13 +260,13 @@ sub _plack_loader_args {
     );
 }
 
-sub _application_args {
-    my ($self) = shift;
+around _application_args => sub {
+    my ($orig, $self) = @_;
     return (
         $self->port,
         $self->host,
         {
-           argv => $self->ARGV,
+           %{ $self->$orig },
            map { $_ => $self->$_ } qw/
                 fork
                 keepalive
@@ -259,13 +274,14 @@ sub _application_args {
                 pidfile
                 keepalive
                 follow_symlinks
+                port
+                host
             /,
         },
     );
-}
+};
 
 __PACKAGE__->meta->make_immutable;
-
 1;
 
 =head1 NAME
@@ -307,6 +323,10 @@ Catalyst::Script::Server - Catalyst test server
 
 Run a Catalyst test server for this application.
 
+=head1 SEE ALSO
+
+L<Catalyst::ScriptRunner>
+
 =head1 AUTHORS
 
 Catalyst Contributors, see Catalyst.pm