424cefe51170a3378314f7aff7600f0786f502d3
[gitmo/MooseX-Runnable.git] / lib / MooseX / Runnable / Invocation / Plugin / Restart.pm
1 package MooseX::Runnable::Invocation::Plugin::Restart;
2 use Moose::Role;
3 use MooseX::Types::Moose qw(Str);
4 use AnyEvent;
5 use namespace::autoclean;
6
7 with 'MooseX::Runnable::Invocation::Plugin::Restart::Base';
8
9 has 'completion_condvar' => (
10     is       => 'ro',
11     isa      => 'AnyEvent::CondVar',
12     required => 1,
13     default  => sub { AnyEvent->condvar },
14 );
15
16 has 'kill_signal' => (
17     is       => 'ro',
18     isa      => Str,
19     required => 1,
20     default  => sub { 'INT' },
21 );
22
23 has 'restart_signal' => (
24     is       => 'ro',
25     isa      => Str,
26     required => 1,
27     default  => sub { 'HUP' },
28 );
29
30 sub _build_initargs_from_cmdline {
31     my ($class, @args) = @_;
32     confess 'Bad args passed to Restart plugin'
33       unless @args % 2 == 0;
34
35     my %args = @args;
36
37     my %res;
38     if(my $kill = $args{'--kill-signal'}){
39         $res{kill_signal} = $kill;
40     }
41     if(my $res = $args{'--restart-signal'}){
42         $res{restart_signal} = $res;
43     }
44     return \%res;
45 }
46
47 after '_restart_parent_setup' => sub {
48     my $self = shift;
49     my ($kw, $rw);
50     $kw = AnyEvent->signal( signal => $self->kill_signal, cb => sub {
51         $self->kill_child;
52         undef $kw;
53         $self->completion_condvar->send(0); # parent exit code
54     });
55
56     $rw = AnyEvent->signal( signal => $self->restart_signal, cb => sub {
57         $rw = $rw; # closes over $rw and prevents it from being GC'd
58         $self->restart;
59     });
60 };
61
62 sub run_parent_loop {
63     my $self = shift;
64     print {*STDERR} "Control pid is $$\n";
65     return $self->completion_condvar->wait;
66 }
67
68 1;