File Coverage

blib/lib/Data/Model/Iterator.pm
Criterion Covered Total %
statement 45 47 95.7
branch 2 2 100.0
condition 9 9 100.0
subroutine 23 25 92.0
pod 3 5 60.0
total 82 88 93.1


line stmt bran cond sub pod time code
1             package Data::Model::Iterator;
2 75     75   31482 use strict;
  75         139  
  75         2409  
3 75     75   499 use warnings;
  75         135  
  75         3821  
4             use overload
5 24     24   10717 '<>' => sub { shift->next },
6 75     75   9362 fallback => 1;
  75         6008  
  75         954  
7              
8             sub new {
9 180     180 0 699 my($class, $code, %args) = @_;
10             bless {
11             code => $code,
12             cache => [],
13             count => 0,
14 4     4   10 reset => delete $args{reset} || sub {},
15 90     90   2667 end => delete $args{end} || sub {},
16 4     4   32 wrapper => delete $args{wrapper} || sub { shift },
17 180   100     5819 }, $class;
      100        
      100        
18             }
19              
20             sub has_next {
21 27     27 1 3974 my $self = shift;
22 27         71 my $obj = $self->next;
23 27         63 $self->{count}--;
24 27         136 !!$obj;
25             }
26              
27             sub next {
28 677     677 1 216178 my $self = shift;
29 677   100     5060 $self->{cache}->[$self->{count}++] ||= do {
30 641         13948 my $obj = $self->{code}->();
31 641 100       12165 $obj ? $self->{wrapper}->( $obj ) : undef;
32             };
33             }
34              
35             sub reset {
36 9     9 1 41 my $self = shift;
37 9         23 $self->{count} = 0;
38 9         36 $self->{reset}->();
39             }
40              
41             sub end {
42 182     182 0 350 my $self = shift;
43 182         718 $self->{end}->();
44             }
45              
46 180     180   32776 sub DESTROY { shift->end };
47              
48             package Data::Model::Iterator::Empty;
49 75     75   39882 use strict;
  75         150  
  75         3381  
50 75     75   380 use warnings;
  75         154  
  75         7323  
51             use overload
52 0     0   0 q{""} => sub { undef },
53 0     0   0 q{0+} => sub { undef },
54 54     54   14227 'bool' => sub { undef },
55 2     2   10 '<>' => sub { shift->next },
56 75     75   479 fallback => 1;
  75         168  
  75         1161  
57              
58 54     54   3686 sub new { bless {}, shift }
59 8     8   34 sub has_next { 0 }
60 4     4   17 sub next { undef }
61 1     1   4 sub reset { undef }
62 1     1   19 sub end { undef }
63              
64             1;
65             __END__