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