File Coverage

blib/lib/AnyEvent/Sub/Retry.pm
Criterion Covered Total %
statement 41 44 93.1
branch 7 8 87.5
condition 1 3 33.3
subroutine 7 7 100.0
pod 1 1 100.0
total 57 63 90.4


line stmt bran cond sub pod time code
1             package AnyEvent::Sub::Retry;
2 3     3   58863 use 5.008005;
  3         10  
  3         115  
3 3     3   16 use strict;
  3         4  
  3         105  
4 3     3   22 use warnings;
  3         53  
  3         147  
5             our $VERSION = "0.04";
6 3     3   2892 use parent qw/Exporter/;
  3         1064  
  3         14  
7 3     3   9826 use AnyEvent;
  3         20453  
  3         1362  
8              
9             our @EXPORT = qw/retry/;
10              
11              
12             sub retry {
13 8     8 1 30295 my ( $retry_count, $retry_interval, $code_ref ) = @_;
14              
15 8         13100 my $all_cv = AE::cv;
16 8         9827 my $timer;
17             my $try;
18             $try = sub {
19 10     10   1307 my $cv = eval { $code_ref->() };
  10         1161  
20 10 100       30837 if ($@) {
21 1         2 undef $try;
22 1         5 $all_cv->croak( sprintf( "code_ref died with message:%s", $@ ) );
23 1         15 return;
24             }
25              
26 9 50 33     1354 unless ( $cv && ref($cv) eq 'AnyEvent::CondVar' ) {
27 0         0 undef $try;
28 0         0 $all_cv->croak(
29             sprintf( "code_ref does not return condvar ref:%s", ref($cv) )
30             );
31 0         0 return;
32             }
33             $cv->cb(
34             sub {
35 9         23044 my @vals = eval { shift->recv };
  9         1209  
36 9 100       9571 if ($@) {
37 3         13 $retry_count--;
38 3 100       12 if ( $retry_count > 0 ) {
39             $timer = AnyEvent->timer(
40 2         200595 cb => sub { $try->(); undef $timer; },
  2         53  
41 2         21 after => $retry_interval,
42             );
43             }
44             else {
45 1         3 undef $try;
46 1         4 $all_cv->croak($@);
47             }
48             }
49             else {
50 6         1158 undef $try;
51 6         1068 $all_cv->send(@vals);
52             }
53             }
54 9         1164 );
55 8         1491 };
56 8         1352 $try->();
57 8         7618 return $all_cv;
58             }
59              
60             1;
61             __END__