Tag plugins that can take cmdline args with Role::CmdlineArgs; add test
[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
2828ce0c 7with 'MooseX::Runnable::Invocation::Plugin::Restart::Base',
8 'MooseX::Runnable::Invocation::Plugin::Role::CmdlineArgs';
469bd410 9
10has 'completion_condvar' => (
11 is => 'ro',
12 isa => 'AnyEvent::CondVar',
13 required => 1,
14 default => sub { AnyEvent->condvar },
15);
16
17has 'kill_signal' => (
18 is => 'ro',
19 isa => Str,
20 required => 1,
21 default => sub { 'INT' },
22);
23
24has 'restart_signal' => (
25 is => 'ro',
26 isa => Str,
27 required => 1,
28 default => sub { 'HUP' },
29);
30
a496e4e5 31sub _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
469bd410 48after '_restart_parent_setup' => sub {
49 my $self = shift;
469bd410 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
63sub run_parent_loop {
64 my $self = shift;
65 print {*STDERR} "Control pid is $$\n";
66 return $self->completion_condvar->wait;
67}
68
691;