moving the Pid file stuff out into a role, and make a types module
[gitmo/MooseX-Daemonize.git] / lib / MooseX / Daemonize.pm
index ffae577..da4923c 100644 (file)
@@ -1,16 +1,17 @@
 package MooseX::Daemonize;
 use strict;    # because Kwalitee is pedantic
 use Moose::Role;
-use MooseX::Types::Path::Class;
-use Moose::Util::TypeConstraints;
 
-our $VERSION = 0.05;
+use MooseX::Daemonize::Types;
 
-use Carp 'carp';
-use Proc::Daemon;
-use MooseX::Daemonize::PidFile;
+our $VERSION = 0.05;
 
-with qw(MooseX::Getopt);
+with qw[
+    MooseX::Daemonize::Core
+    MooseX::Daemonize::WithSignalHandling
+    MooseX::Daemonize::WithPidFile    
+    MooseX::Getopt
+];
 
 has progname => (
     isa      => 'Str',
@@ -23,46 +24,22 @@ has progname => (
     },
 );
 
-has basedir => (
+has pidbase => (
     isa      => 'Path::Class::Dir',
     is       => 'ro',
     coerce   => 1,
-    required => 1,
+    required => 1,    
     lazy     => 1,
-    default  => sub { Path::Class::Dir->new('/') },
+    default  => sub { Path::Class::Dir->new('var', 'run') },
 );
 
-has pidbase => (
+has basedir => (
     isa      => 'Path::Class::Dir',
     is       => 'ro',
     coerce   => 1,
-    required => 1,    
+    required => 1,
     lazy     => 1,
-    default  => sub { Path::Class::Dir->new('var', 'run') },
-);
-
-coerce 'MooseX::Daemonize::PidFile' 
-    => from 'Str' 
-        => via { MooseX::Daemonize::PidFile->new( file => $_ ) };
-
-has pidfile => (
-    isa       => 'MooseX::Daemonize::PidFile',
-    is        => 'rw',
-    lazy      => 1,
-    required  => 1,
-    coerce    => 1,
-    predicate => 'has_pidfile',
-    default   => sub {
-        my $file = $_[0]->pidbase . '/' . $_[0]->progname . '.pid';
-        confess "Cannot write to $file" unless (-e $file ? -w $file : -w $_[0]->pidbase);
-        MooseX::Daemonize::PidFile->new( file => $file );
-    },
-    handles => {
-        check      => 'running',
-        save_pid   => 'write',
-        remove_pid => 'remove',
-        get_pid    => 'pid',
-    },
+    default  => sub { Path::Class::Dir->new('/') },
 );
 
 has foreground => (
@@ -73,29 +50,23 @@ has foreground => (
     default     => sub { 0 },
 );
 
-has is_daemon => (
-    isa     => 'Bool',
-    is      => 'rw',
-    default => sub { 0 },
-);
-
 has stop_timeout => (
     isa     => 'Int',
     is      => 'rw',
     default => sub { 2 }
 );
 
-sub daemonize {
-    my ($self) = @_;
-    return if Proc::Daemon::Fork;
-    Proc::Daemon::Init;
-    $self->is_daemon(1);
+sub init_pidfile {
+    my $self = shift;
+    my $file = $self->pidbase . '/' . $self->progname . '.pid';
+    confess "Cannot write to $file" unless (-e $file ? -w $file : -w $self->pidbase);
+    MooseX::Daemonize::PidFile->new( file => $file );
 }
 
 sub start {
     my ($self) = @_;
     
-    confess "instance already running" if $self->check;
+    confess "instance already running" if $self->pidfile->running;
     
     $self->daemonize unless $self->foreground;
 
@@ -112,7 +83,7 @@ sub start {
     # Change to basedir
     chdir $self->basedir;
 
-    $self->save_pid;
+    $self->pidfile->write;
     $self->setup_signals;
     return $$;
 }
@@ -122,9 +93,9 @@ my $_kill;
 
 sub stop {
     my ( $self, %args ) = @_;
-    my $pid = $self->get_pid;
+    my $pid = $self->pidfile->pid;
     $self->$_kill($pid) unless $self->foreground();
-    $self->remove_pid;
+    $self->pidfile->remove;
     return 1 if $args{no_exit};
     exit;
 }
@@ -135,10 +106,10 @@ sub restart {
     $self->start();
 }
 
-sub setup_signals {
-    my ($self) = @_;
-    $SIG{INT} = sub { $self->handle_sigint; };
-    $SIG{HUP} = sub { $self->handle_sighup };
+sub handle_signal {
+    my ($self, $signal) = @_;
+    return $self->handle_sigint if $signal eq 'INT';
+    return $self->handle_sighup if $signal eq 'HUP';    
 }
 
 sub handle_sigint { $_[0]->stop; }
@@ -166,24 +137,24 @@ $_kill = sub {
 
     # Try SIGINT ... 2s ... SIGTERM ... 2s ... SIGKILL ... 3s ... UNDEAD!
     for ( [ 2, $timeout ], [15, $timeout], [9, $timeout * 1.5] ) {
-      my ($signal, $timeout) = @$_;
-      $timeout = int $timeout;
-
-      CORE::kill($signal, $pid);
-
-      last unless CORE::kill 0 => $pid or $!{EPERM};
-
-      while ($timeout) {
-        sleep(1);
+        my ($signal, $timeout) = @$_;
+        $timeout = int $timeout;
+        
+        CORE::kill($signal, $pid);
+        
         last unless CORE::kill 0 => $pid or $!{EPERM};
-        $timeout--;
-      }
+        
+        while ($timeout) {
+            sleep(1);
+            last unless CORE::kill 0 => $pid or $!{EPERM};
+            $timeout--;
+        }
     }
 
     return unless ( CORE::kill 0 => $pid or $!{EPERM} );
 
     # IF it is still running
-    carp "$pid doesn't seem to want to die.";     # AHH EVIL DEAD!
+    Carp::carp "$pid doesn't seem to want to die.";     # AHH EVIL DEAD!
 };
 
 1;
@@ -262,10 +233,6 @@ it. Defaults to 2 seconds
 
 =over
 
-=item check()
-
-Check to see if an instance is already running.
-
 =item start()
 
 Setup a pidfile, fork, then setup the signal handlers.
@@ -297,18 +264,6 @@ Handle a INT signal, by default calls C<$self->stop()>
 
 Handle a HUP signal. By default calls C<$self->restart()>
 
-=item get_pid
-
-Lookup the pid from our pidfile.
-
-=item save_pid
-
-Save the current pid in our pidfile
-
-=item remove_pid
-
-Delete our pidfile
-
 =item meta()
 
 The C<meta()> method from L<Class::MOP::Class>