1 package Catalyst::Restarter;
5 use File::ChangeNotify;
6 use namespace::clean -except => 'meta';
16 isa => 'File::ChangeNotify::Watcher',
28 delete $p->{start_sub};
30 $p->{filter} ||= qr/(?:\/|^)(?!\.\#).+(?:\.yml$|\.yaml$|\.conf|\.pm)$/;
32 # We could make this lazily, but this lets us check that we
33 # received valid arguments for the watcher up front.
34 $self->_watcher( File::ChangeNotify->instantiate_watcher( %{$p} ) );
40 $self->_fork_and_start;
42 return unless $self->_child;
44 $self->_restart_on_changes;
50 if ( my $pid = fork ) {
58 sub _restart_on_changes {
61 my @events = $self->_watcher->wait_for_events();
62 $self->_handle_events(@events);
70 print STDERR "Saw changes to the following files:\n";
72 for my $event (@events) {
73 my $path = $event->path();
74 my $type = $event->type();
76 print STDERR " - $path ($type)\n";
80 print STDERR "Attempting to restart the server\n\n";
84 $self->_fork_and_start;
86 $self->_restart_on_changes;
92 return unless $self->_child;
94 return unless kill 0, $self->_child;
96 local $SIG{CHLD} = 'IGNORE';
97 unless ( kill 'INT', $self->_child ) {
98 # The kill 0 thing does not work on Windows, but the restarter
99 # seems to work fine on Windows with this hack.
100 return if $^O eq 'MSWin32';
101 die "Cannot send INT signal to ", $self->_child, ": $!";
111 __PACKAGE__->meta->make_immutable;
119 Catalyst::Restarter - Uses File::ChangeNotify to check for changed files and restart the server
123 my $restarter = Catalyst::Restarter->new(
124 directories => '/path/to/MyApp',
125 regex => '\.yml$|\.yaml$|\.conf|\.pm$',
126 start_sub => sub { ... }
129 $restarter->run_and_watch;
133 This class uses L<File::ChangeNotify> to watch one or more directories
134 of files and restart the Catalyst server when any of those files
139 =head2 new ( start_sub => sub { ... }, ... )
141 This method creates a new restarter object.
143 The "start_sub" argument is required. This is a subroutine reference
144 that can be used to start the Catalyst server.
148 This method forks, starts the server in a child process, and then
149 watched for changed files in the parent. When files change, it kills
150 the child, forks again, and starts a new server.
154 L<Catalyst>, <File::ChangeNotify>
158 Catalyst Contributors, see Catalyst.pm
162 This program is free software, you can redistribute it and/or modify
163 it under the same terms as Perl itself.