File Coverage

lib/Config/HAProxy/Iterator.pm
Criterion Covered Total %
statement 41 45 91.1
branch 14 20 70.0
condition 2 3 66.6
subroutine 10 10 100.0
pod 4 5 80.0
total 71 83 85.5


line stmt bran cond sub pod time code
1             package Config::HAProxy::Iterator;
2 3     3   19 use strict;
  3         7  
  3         84  
3 3     3   13 use warnings;
  3         4  
  3         66  
4 3     3   14 use Config::HAProxy::Node;
  3         4  
  3         102  
5 3     3   16 use Carp;
  3         6  
  3         213  
6              
7             use constant {
8 3         1576 NO_RECURSION => 0,
9             INORDER => 1,
10             POSTORDER => 2
11 3     3   21 };
  3         5  
12              
13             sub new {
14 20     20 0 29 my $class = shift;
15 20         24 my $node = shift;
16 20         27 my $self = bless { }, $class;
17 20 50       40 if ($node->is_section) {
18 20         37 $self->{_list} = [ $node->tree() ];
19             } else {
20 0         0 $self->{_list} = [ $node ];
21             }
22 20         45 local %_ = @_;
23 20 100       36 if (defined($_{recursive})) {
    50          
    0          
24 16         23 $self->{_recursive} = $_{recursive};
25             } elsif ($_{inorder}) {
26 4         7 $self->{_recursive} = INORDER;
27             } elsif ($_{postorder}) {
28 0         0 $self->{_recursive} = POSTORDER;
29             } else {
30 0         0 $self->{_recursive} = NO_RECURSION;
31             }
32 20         40 return $self;
33             }
34              
35 68     68 1 166 sub recursive { shift->{_recursive} }
36 16     16 1 47 sub inorder { shift->{_recursive} == INORDER }
37 16     16 1 38 sub postorder { shift->{_recursive} == POSTORDER }
38              
39             sub next {
40 108     108 1 136 my $self = shift;
41              
42 108 100       156 if ($self->{_itr}) {
43 52 100       81 if (defined(my $v = $self->{_itr}->next())) {
44 36         78 return $v;
45             } else {
46 16         36 delete $self->{_itr};
47 16 50       25 return $self->{_cur} if $self->postorder;
48             }
49             }
50              
51 72 100       407 if (defined($self->{_cur} = shift @{$self->{_list}})) {
  72         134  
52 52 100 66     68 if ($self->recursive && $self->{_cur}->is_section) {
53 16         22 $self->{_itr} = $self->{_cur}->iterator(recursive => $self->recursive);
54 16 50       26 if ($self->inorder) {
55 16         48 return $self->{_cur};
56             } else {
57 0         0 return $self->next();
58             }
59             }
60             }
61              
62 56         105 return $self->{_cur};
63             }
64              
65             1;
66             __END__