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   773 use Moo;
  1         9424  
  1         4  
3              
4             our $VERSION = '0.001001';
5             $VERSION = eval $VERSION;
6              
7 1     1   2269 use AnyEvent;
  1         3579  
  1         31  
8 1     1   4 use Scalar::Util qw(weaken);
  1         1  
  1         62  
9 1     1   342 use Safe::Isa;
  1         283  
  1         112  
10 1     1   664 use DateTime;
  1         103415  
  1         39  
11 1     1   578 use DateTime::Event::Cron;
  1         35599  
  1         31  
12 1     1   480 use namespace::clean;
  1         6814  
  1         5  
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__