X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP%2FRestarter.pm;h=c2db06507245cdaecbe9662a67d5b187a236f306;hp=c23390bfc77778a044d3e886e3b43c84616457fe;hb=ae29b412955743885e80350085167b54b69672da;hpb=e16a6c4e6c4d49e73b5286b3186616af14f3f554 diff --git a/lib/Catalyst/Engine/HTTP/Restarter.pm b/lib/Catalyst/Engine/HTTP/Restarter.pm index c23390b..c2db065 100644 --- a/lib/Catalyst/Engine/HTTP/Restarter.pm +++ b/lib/Catalyst/Engine/HTTP/Restarter.pm @@ -1,12 +1,14 @@ 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 ||= {}; @@ -18,6 +20,12 @@ sub run { close STDIN; close STDOUT; + # Avoid "Setting config after setup" error restarting MyApp.pm + $class->setup_finished(0); + # 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 => ( $options->{restart_directory} || @@ -67,7 +75,20 @@ 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) { + # Paranoia unneeded, all component metaclasses should have immutable + $meta->make_mutable if $meta->is_immutable; + } } 1;