File Coverage

blib/lib/DBIx/QuickORM/Iterator.pm
Criterion Covered Total %
statement 40 57 70.1
branch 10 18 55.5
condition 0 3 0.0
subroutine 8 12 66.6
pod 0 7 0.0
total 58 97 59.7


line stmt bran cond sub pod time code
1             package DBIx::QuickORM::Iterator;
2 24     24   184 use strict;
  24         57  
  24         1287  
3 24     24   142 use warnings;
  24         50  
  24         2150  
4              
5             our $VERSION = '0.000019';
6              
7 24     24   198 use Carp qw/croak/;
  24         52  
  24         2307  
8              
9             sub new;
10              
11 24         276 use DBIx::QuickORM::Util::HashBase qw{
12             generator
13             items
14             generator_done
15             index
16             +ready
17             +is_ready
18 24     24   180 };
  24         48  
19              
20             sub new {
21 4     4 0 37 my $class = shift;
22 4         36 my ($gen, $ready) = @_;
23              
24 4         96 my $self = bless({GENERATOR() => $gen, READY => $ready}, $class);
25 4         125 $self->init;
26              
27 4         45 return $self;
28             }
29              
30             sub init {
31 4     4 0 24 my $self = shift;
32              
33 4 50       156 croak "Generator is required" unless $self->{+GENERATOR};
34              
35 4 50       45 croak "Generator must be a code reference, got '$self->{+GENERATOR}'" unless ref($self->{+GENERATOR}) eq 'CODE';
36              
37 4         25 $self->{+INDEX} = 0;
38 4         72 $self->{+ITEMS} = [];
39              
40 4         49 $self->{+GENERATOR_DONE} = 0;
41             }
42              
43             sub first {
44 0     0 0 0 my $self = shift;
45 0         0 $self->{+INDEX} = 0;
46 0         0 $self->next;
47             }
48              
49             sub list {
50 0     0 0 0 my $self = shift;
51 0         0 local $self->{+INDEX} = 0;
52              
53 0         0 my $set = $self->{+ITEMS};
54 0         0 $self->_grow until $self->{+GENERATOR_DONE};
55              
56 0         0 return @$set;
57             }
58              
59             sub ready {
60 0     0 0 0 my $self = shift;
61 0 0       0 my $cb = $self->{+READY} or return 1;
62 0   0     0 return $self->{+IS_READY} ||= $cb->();
63             }
64              
65             sub next {
66 23     23 0 201 my $self = shift;
67              
68 23         80 my $idx = $self->{+INDEX};
69 23         56 my $set = $self->{+ITEMS};
70              
71 23 50       103 unless ($idx < @$set) {
72 23 100       118 return if $self->{+GENERATOR_DONE};
73 22 100       98 return unless $self->_grow;
74             }
75              
76 18         41 $self->{+INDEX}++;
77 18         118 return $set->[$idx];
78             }
79              
80             sub last {
81 0     0 0 0 my $self = shift;
82              
83 0         0 my $set = $self->{+ITEMS};
84              
85 0         0 $self->_grow until $self->{+GENERATOR_DONE};
86              
87 0         0 $self->{+INDEX} = scalar @$set;
88              
89 0 0       0 return unless @$set;
90 0         0 return $set->[-1];
91             }
92              
93             sub _grow {
94 22     22   42 my $self = shift;
95              
96 22 50       93 return 0 if $self->{+GENERATOR_DONE};
97              
98 22         135 my $add = $self->{+GENERATOR}->();
99              
100 22 100       78 unless (defined $add) {
101 4         11 $self->{+GENERATOR_DONE} = 1;
102 4         24 return 0;
103             }
104              
105 18         35 push @{$self->{+ITEMS}} => $add;
  18         52  
106 18         55 return 1;
107             }
108              
109             1;