cc4938249d413347a242eac197b115af1235a5a7
[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 after '_restart_parent_setup' => sub {
31     my $self = shift;
32
33     my ($kw, $rw);
34     $kw = AnyEvent->signal( signal => $self->kill_signal, cb => sub {
35         $self->kill_child;
36         undef $kw;
37         $self->completion_condvar->send(0); # parent exit code
38     });
39
40     $rw = AnyEvent->signal( signal => $self->restart_signal, cb => sub {
41         $rw = $rw; # closes over $rw and prevents it from being GC'd
42         $self->restart;
43     });
44 };
45
46 sub run_parent_loop {
47     my $self = shift;
48     print {*STDERR} "Control pid is $$\n";
49     return $self->completion_condvar->wait;
50 }
51
52 1;