DateTime-Event-Cron

 view release on metacpan or  search on metacpan

lib/DateTime/Event/Cron.pm  view on Meta::CPAN

package DateTime::Event::Cron;

use 5.006;
use strict;
use warnings;
use Carp;

use vars qw($VERSION);

$VERSION = '0.09';

use constant DEBUG => 0;

use DateTime;
use DateTime::Set;
use DateTime::Duration;
use Set::Crontab;

my %Object_Attributes;

###

sub from_cron {
  # Return cron as DateTime::Set
  my $class = shift;
  my %sparms = @_ == 1 ? (cron => shift) : @_;
  my %parms;
  $parms{cron}      = delete $sparms{cron};
  $parms{user_mode} = delete $sparms{user_mode};
  $parms{cron} or croak "Cron string parameter required.\n";
  my $dtc = $class->new(%parms);
  $dtc->as_set(%sparms);
}

sub from_crontab {
  # Return list of DateTime::Sets based on entries from
  # a crontab file.
  my $class = shift;
  my %sparms = @_ == 1 ? (file => shift) : @_;
  my $file = delete $sparms{file};
  delete $sparms{cron};
  my $fh = $class->_prepare_fh($file);
  my @cronsets;
  while (<$fh>) {
    chomp;
    my $set;
    eval { $set = $class->from_cron(%sparms, cron => $_) };
    push(@cronsets, $set) if ref $set && !$@;
  }
  @cronsets;
}

sub as_set {
  # Return self as DateTime::Set
  my $self = shift;
  my %sparms = @_;
  Carp::cluck "Recurrence callbacks overriden by ". ref $self . "\n"
    if $sparms{next} || $sparms{recurrence} || $sparms{previous};
  delete $sparms{next};
  delete $sparms{previous};
  delete $sparms{recurrence};
  $sparms{next}     = sub { $self->next(@_) };
  $sparms{previous} = sub { $self->previous(@_) };
  DateTime::Set->from_recurrence(%sparms);
}

###

sub new {
  my $class = shift;
  my $self = {};
  bless $self, $class;
  my %parms = @_ == 1 ? (cron => shift) : @_;
  my $crontab = $self->_make_cronset(%parms);
  $self->_cronset($crontab);
  $self;
}

sub new_from_cron { new(@_) }

sub new_from_crontab {
  my $class = shift;
  my %parms = @_ == 1 ? (file => shift()) : @_;
  my $fh = $class->_prepare_fh($parms{file});
  delete $parms{file};
  my @dtcrons;
  while (<$fh>) {
    my $dtc;
    eval { $dtc = $class->new(%parms, cron => $_) };
    if (ref $dtc && !$@) {
      push(@dtcrons, $dtc);
      $parms{user_mode} = 1 if defined $dtc->user;
    }
  }
  @dtcrons;
}

###

sub _prepare_fh {
  my $class = shift;
  my $fh = shift;
  if (! ref $fh) {
    my $file = $fh;
    local(*FH);
    $fh = do { local *FH; *FH }; # doubled *FH avoids warning
    open($fh, "<$file")
      or croak "Error opening $file for reading\n";
  }
  $fh;
}

###

sub valid {
  # Is the given date valid according the current cron settings?
  my($self, $date) = @_;



( run in 1.702 second using v1.01-cache-2.11-cpan-39bf76dae61 )