X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP%2FRestarter.pm;h=0fffaf0fb4cc1156446378001feee8e750ae7c0a;hb=c03163b837135f3bf3d65380e90b4a68bcc38099;hp=0c73ebd991d335d3349555ba0ac6010a0ffc15d3;hpb=5303e1782e6a92d80eee93c79d2907dd55a01821;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/HTTP/Restarter.pm b/lib/Catalyst/Engine/HTTP/Restarter.pm index 0c73ebd..0fffaf0 100644 --- a/lib/Catalyst/Engine/HTTP/Restarter.pm +++ b/lib/Catalyst/Engine/HTTP/Restarter.pm @@ -1,31 +1,35 @@ package Catalyst::Engine::HTTP::Restarter; +use Moose; +use Moose::Util qw/find_meta/; +use namespace::clean -except => 'meta'; + +extends 'Catalyst::Engine::HTTP'; -use strict; -use warnings; -use base 'Catalyst::Engine::HTTP'; use Catalyst::Engine::HTTP::Restarter::Watcher; -use NEXT; -sub run { +around run => sub { + my $orig = shift; my ( $self, $class, $port, $host, $options ) = @_; $options ||= {}; - die "Sorry, but 'restart' doesn't work together with 'fork'.\n" - if $options->{fork}; - # Setup restarter - my $restarter; - my $parent = $$; - - unless ( $restarter = fork ) { + unless ( my $restarter = fork ) { # Prepare close STDIN; close STDOUT; + # Best effort if we can't trap compiles.. + $self->_make_components_mutable($class) + if !Catalyst::Engine::HTTP::Restarter::Watcher::DETECT_PACKAGE_COMPILATION(); + my $watcher = Catalyst::Engine::HTTP::Restarter::Watcher->new( - directory => File::Spec->catdir( $FindBin::Bin, '..' ), + directory => ( + $options->{restart_directory} || + File::Spec->catdir( $FindBin::Bin, '..' ) + ), + follow_symlinks => $options->{follow_symlinks}, regex => $options->{restart_regex}, delay => $options->{restart_delay}, ); @@ -57,7 +61,7 @@ sub run { # build the Kill request my $req = - HTTP::Request->new( 'KILL', '/', + HTTP::Request->new( 'RESTART', '/', HTTP::Headers->new( 'Connection' => 'close' ) ); $req->protocol('HTTP/1.0'); @@ -69,7 +73,19 @@ sub run { } } - return $self->NEXT::run( $class, $port, $host, $options ); + return $self->$orig( $class, $port, $host, $options ); +}; + +# Naive way of trying to avoid Moose blowing up when you re-require components +# which have been made immutable. +sub _make_components_mutable { + my ($self, $class) = @_; + + my @metas = map { find_meta($_) } ($class, map { blessed($_) } values %{ $class->components }); + + foreach my $meta (@metas) { + $meta->make_mutable if $meta->is_immutable; + } } 1; @@ -90,11 +106,7 @@ and restart the server when any changes are detected. =head1 METHODS -=over 4 - -=item run - -=back +=head2 run =head1 SEE ALSO @@ -103,11 +115,7 @@ L. =head1 AUTHORS -Sebastian Riedel, - -Dan Kubb, - -Andy Grundman, +Catalyst Contributors, see Catalyst.pm =head1 THANKS