setup signals from the command line
[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
a496e4e5 30sub _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
469bd410 47after '_restart_parent_setup' => sub {
48 my $self = shift;
469bd410 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
62sub run_parent_loop {
63 my $self = shift;
64 print {*STDERR} "Control pid is $$\n";
65 return $self->completion_condvar->wait;
66}
67
681;