File Coverage

blib/lib/AnyEvent/Timer/Cron.pm
Criterion Covered Total %
statement 21 35 60.0
branch 0 4 0.0
condition 0 3 0.0
subroutine 7 11 63.6
pod 0 3 0.0
total 28 56 50.0


line stmt bran cond sub pod time code
1             package AnyEvent::Timer::Cron;
2 1     1   984 use Moo;
  1         11871  
  1         5  
3              
4             our $VERSION = '0.001002';
5             $VERSION = eval $VERSION;
6              
7 1     1   2624 use AnyEvent;
  1         4087  
  1         40  
8 1     1   5 use Scalar::Util qw(weaken);
  1         1  
  1         78  
9 1     1   604 use Safe::Isa;
  1         333  
  1         118  
10 1     1   813 use DateTime;
  1         106388  
  1         42  
11 1     1   605 use DateTime::Event::Cron;
  1         41603  
  1         35  
12 1     1   540 use namespace::clean;
  1         7802  
  1         7  
13              
14             has 'cb' => (is => 'ro', required => 1);
15             has '_cron' => (
16             is => 'ro',
17             required => 1,
18             init_arg => 'cron',
19             coerce => sub {
20             my $cron = shift;
21             if (!ref $cron) {
22             $cron = DateTime::Event::Cron->new($cron);
23             }
24             if ($cron->$_can('next')) {
25             return sub { $cron->next(@_) };
26             }
27             elsif ($cron->$_can('get_next_valid_time_after')) {
28             return sub { $cron->get_next_valid_time_after(@_) };
29             }
30             die "Invalid cron!";
31             },
32             );
33             has '_timer' => (is => 'rw');
34              
35             sub BUILD {
36 0     0 0   my $self = shift;
37 0           $self->create_timer;
38             }
39              
40             sub create_timer {
41 0     0 0   my $self = shift;
42 0           weaken $self;
43 0           my $now = DateTime->from_epoch(epoch => AnyEvent->now);
44 0           my $next = $self->next_event($now);
45             return
46 0 0         if not $next;
47 0           my $interval = $next->subtract_datetime_absolute($now)->in_units('nanoseconds') / 1_000_000_000;
48             $self->_timer(AnyEvent->timer(
49             after => $interval,
50             cb => sub {
51 0     0     $self->{cb}->();
52 0 0         $self && $self->create_timer;
53             },
54 0           ));
55             }
56              
57             sub next_event {
58 0     0 0   my $self = shift;
59 0   0       my $now = shift || DateTime->from_epoch(epoch => AnyEvent->now);
60 0           $self->_cron->($now);
61             }
62              
63             1;
64             __END__