X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FPlugin%2FScheduler.pm;h=e7a39748db9cd2bf9077db8269e0acb305e2d6df;hb=6eb67b0f12bd475c2220b16e5730f3aa04ddcd77;hp=3c4d649360d1ce83551726523aeb11765e723b9d;hpb=13b998adb67bfd51cab7a4752a4f453fd6b5fac2;p=catagits%2FCatalyst-Plugin-Scheduler.git diff --git a/lib/Catalyst/Plugin/Scheduler.pm b/lib/Catalyst/Plugin/Scheduler.pm index 3c4d649..e7a3974 100644 --- a/lib/Catalyst/Plugin/Scheduler.pm +++ b/lib/Catalyst/Plugin/Scheduler.pm @@ -7,12 +7,11 @@ use DateTime; use DateTime::Event::Cron; use DateTime::TimeZone; use File::stat; -use NEXT; use Set::Scalar; use Storable qw/lock_store lock_retrieve/; -use YAML; +use MRO::Compat; -our $VERSION = '0.07'; +our $VERSION = '0.10'; __PACKAGE__->mk_classdata( '_events' => [] ); __PACKAGE__->mk_accessors('_event_state'); @@ -59,7 +58,7 @@ sub schedule { sub dispatch { my $c = shift; - $c->NEXT::dispatch(@_); + $c->maybe::next::method(); $c->_get_event_state(); @@ -158,19 +157,33 @@ sub setup { $c->config->{scheduler}->{state_file} ||= $c->path_to('scheduler.state'); $c->config->{scheduler}->{hosts_allow} ||= '127.0.0.1'; $c->config->{scheduler}->{yaml_file} ||= $c->path_to('scheduler.yml'); + + # Always start with a clean state + if ( -e $c->config->{scheduler}->{state_file} ) { + $c->log->debug( + 'Scheduler: Removing old state file ' . + $c->config->{scheduler}->{state_file} + ) if $c->config->{scheduler}->{logging}; + + unlink $c->config->{scheduler}->{state_file} + or Catalyst::Exception->throw( + message => 'Scheduler: Unable to remove old state file ' + . $c->config->{scheduler}->{state_file} . " ($!)" + ); + } - $c->NEXT::setup(@_); + $c->maybe::next::method(@_); } sub dump_these { my $c = shift; - return ( $c->NEXT::dump_these(@_) ) unless @{ $c->_events }; - + return ( $c->maybe::next::method(@_) ) unless @{ $c->_events }; + # for debugging, we dump out a list of all events with their next # scheduled run time return ( - $c->NEXT::dump_these(@_), + $c->maybe::next::method(@_), [ 'Scheduled Events', $c->scheduler_state ], ); } @@ -260,7 +273,19 @@ sub _check_yaml { $c->_events( [] ); my $file = $c->config->{scheduler}->{yaml_file}; - my $yaml = YAML::LoadFile( "$file" ); + my $yaml; + + eval { require YAML::Syck; }; + if( $@ ) { + require YAML; + $yaml = YAML::LoadFile( "$file" ); + } + else { + open( my $fh, $file ) or die $!; + my $content = do { local $/; <$fh> }; + close $fh; + $yaml = YAML::Syck::Load( $content ); + } foreach my $event ( @{$yaml} ) { $c->schedule( %{$event} ); @@ -619,7 +644,7 @@ configuration option L. As an alternative to using the schedule() method, you may define scheduled events in an external YAML file. By default, the plugin looks for the -existence of a file called C in your application's home +existence of a file called C in your application's home directory. You can change the filename using the configuration option L. @@ -655,8 +680,8 @@ maintenance. Plugin authors, B if you do this! Events should be registered from a plugin's C method. sub setup { - my $c = shift; - $c->NEXT::setup(@_); + my $c = shift; + $c->maybe::next::method(@_); if ( $c->can('schedule') ) { $c->schedule(