Add a +Restart plugin that restarts the class on SIGHUP (configurable)
[gitmo/MooseX-Runnable.git] / lib / MooseX / Runnable / Invocation / Plugin / Restart.pm
CommitLineData
469bd410 1package MooseX::Runnable::Invocation::Plugin::Restart;
2use Moose::Role;
3use MooseX::Types::Moose qw(Str);
4use AnyEvent;
5use namespace::autoclean;
6
7with 'MooseX::Runnable::Invocation::Plugin::Restart::Base';
8
9has 'completion_condvar' => (
10 is => 'ro',
11 isa => 'AnyEvent::CondVar',
12 required => 1,
13 default => sub { AnyEvent->condvar },
14);
15
16has 'kill_signal' => (
17 is => 'ro',
18 isa => Str,
19 required => 1,
20 default => sub { 'INT' },
21);
22
23has 'restart_signal' => (
24 is => 'ro',
25 isa => Str,
26 required => 1,
27 default => sub { 'HUP' },
28);
29
30after '_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
46sub run_parent_loop {
47 my $self = shift;
48 print {*STDERR} "Control pid is $$\n";
49 return $self->completion_condvar->wait;
50}
51
521;