/usr/local/CPAN/Catalyst-Engine-HTTP-Prefork/Catalyst/Engine/HTTP/Prefork/Restarter.pm


package Catalyst::Engine::HTTP::Prefork::Restarter;

use strict;

use Catalyst::Engine::HTTP::Restarter::Watcher;
use File::Spec;

use constant DEBUG => $ENV{CATALYST_PREFORK_DEBUG} || 0;

sub init {
    my ( $class, $options ) = @_;
    
    if ( my $pid = fork ) {
        DEBUG && warn "Restarting: Running ($pid)\n";
        return;
    }
    
    $0 .= ' [Prefork::Restarter]';
    
    # Prepare
    close STDIN;
    close STDOUT;

    my $watcher = Catalyst::Engine::HTTP::Restarter::Watcher->new(
        directory       => ( 
            $options->{restart_directory} || 
            File::Spec->catdir( $FindBin::Bin, '..' )
        ),
        follow_symlinks => $options->{follow_symlinks},
        regex           => $options->{restart_regex},
        delay           => $options->{restart_delay},
    );
    
    while (1) {
        # poll for changed files    
        my @changed_files = $watcher->watch();

        # check if our parent process has died
        exit if $^O ne 'MSWin32' and getppid == 1;
        
        # Restart if any files have changed
        if (@changed_files) {
            my $files = join ', ', @changed_files;
            print STDERR qq/File(s) "$files" modified, restarting\n\n/;
            
            kill HUP => getppid;
            
            exit;
        }
    }
}

1;