File Coverage

lib/Config/Proxy/Iterator.pm
Criterion Covered Total %
statement 41 45 91.1
branch 14 20 70.0
condition 3 3 100.0
subroutine 10 10 100.0
pod 4 5 80.0
total 72 83 86.7


line stmt bran cond sub pod time code
1             package Config::Proxy::Iterator;
2 7     7   49 use strict;
  7         11  
  7         267  
3 7     7   32 use warnings;
  7         18  
  7         352  
4 7     7   32 use Config::Proxy::Node;
  7         12  
  7         216  
5 7     7   30 use Carp;
  7         10  
  7         550  
6              
7             use constant {
8 7         4216 NO_RECURSION => 0,
9             INORDER => 1,
10             POSTORDER => 2
11 7     7   50 };
  7         11  
12              
13             sub new {
14 80     80 0 108 my $class = shift;
15 80         97 my $node = shift;
16 80         212 my $self = bless { }, $class;
17 80 50       180 if ($node->is_section) {
18 80         182 $self->{_list} = [ $node->tree() ];
19             } else {
20 0         0 $self->{_list} = [ $node ];
21             }
22 80         280 local %_ = @_;
23 80 100       166 if (defined($_{recursive})) {
    50          
    0          
24 72         114 $self->{_recursive} = $_{recursive};
25             } elsif ($_{inorder}) {
26 8         16 $self->{_recursive} = INORDER;
27             } elsif ($_{postorder}) {
28 0         0 $self->{_recursive} = POSTORDER;
29             } else {
30 0         0 $self->{_recursive} = NO_RECURSION;
31             }
32 80         237 return $self;
33             }
34              
35 320     320 1 1010 sub recursive { shift->{_recursive} }
36 70     70 1 169 sub inorder { shift->{_recursive} == INORDER }
37 70     70 1 204 sub postorder { shift->{_recursive} == POSTORDER }
38              
39             sub next {
40 814     814 1 1057 my $self = shift;
41              
42 814 100       1589 if ($self->{_itr}) {
43 556 100       974 if (defined(my $v = $self->{_itr}->next())) {
44 486         1065 return $v;
45             } else {
46 70         191 delete $self->{_itr};
47 70 50       133 return $self->{_cur} if $self->postorder;
48             }
49             }
50              
51 328 100       402 if (defined($self->{_cur} = shift @{$self->{_list}})) {
  328         817  
52 250 100 100     525 if ($self->recursive && $self->{_cur}->is_section) {
53 70         197 $self->{_itr} = $self->{_cur}->iterator(recursive => $self->recursive);
54 70 50       136 if ($self->inorder) {
55 70         208 return $self->{_cur};
56             } else {
57 0         0 return $self->next();
58             }
59             }
60             }
61              
62 258         753 return $self->{_cur};
63             }
64              
65             1;
66             __END__