File Coverage

blib/lib/Tags/Utils/Preserve.pm
Criterion Covered Total %
statement 52 52 100.0
branch 11 12 91.6
condition 6 6 100.0
subroutine 12 12 100.0
pod 6 6 100.0
total 87 88 98.8


line stmt bran cond sub pod time code
1             package Tags::Utils::Preserve;
2              
3 26     26   122197 use strict;
  26         51  
  26         999  
4 26     26   251 use warnings;
  26         78  
  26         1436  
5              
6 26     26   2231 use Class::Utils qw(set_params);
  26         48261  
  26         1493  
7 26     26   495 use List::Util 1.33 qw(any);
  26         514  
  26         1850  
8 26     26   149 use Readonly;
  26         58  
  26         17121  
9              
10             # Constants.
11             Readonly::Scalar my $LAST_INDEX => -1;
12              
13             our $VERSION = 0.16;
14              
15             # Constructor.
16             sub new {
17 82     82 1 719139 my ($class, @params) = @_;
18 82         214 my $self = bless {}, $class;
19              
20             # Preserved elements.
21 82         263 $self->{'preserved'} = [];
22              
23             # Process params.
24 82         297 set_params($self, @params);
25              
26             # Initialization.
27 80         1044 $self->reset;
28              
29             # Object.
30 80         304 return $self;
31             }
32              
33             # Process for begin of element.
34             sub begin {
35 96     96 1 11144 my ($self, $element) = @_;
36              
37 96         330 $self->save_previous;
38 96 100 100     128 if (scalar @{$self->{'preserved'}}
  96         427  
39 17     17   79 && any { $element eq $_ } @{$self->{'preserved'}}) {
  17         67  
40              
41 8         14 push @{$self->{'preserved_stack'}}, $element;
  8         21  
42 8         25 $self->{'preserved_flag'} = 1;
43             }
44              
45             # Return preserved flags.
46             return wantarray
47             ? ($self->{'preserved_flag'}, $self->{'prev_preserved_flag'})
48 96 100       339 : $self->{'preserved_flag'};
49             }
50              
51             # Process for end of element.
52             sub end {
53 83     83 1 9798 my ($self, $element) = @_;
54              
55 83         250 $self->save_previous;
56 83         132 my $stack = $self->{'preserved_stack'};
57 83 100 100     126 if (scalar @{$stack} && $element eq $stack->[$LAST_INDEX]) {
  83         328  
58 6         13 pop @{$stack};
  6         11  
59 6 50       13 if (! scalar @{$stack}) {
  6         19  
60 6         13 $self->{'preserved_flag'} = 0;
61             }
62             }
63              
64             # Return preserved flags.
65             return wantarray
66             ? ($self->{'preserved_flag'}, $self->{'prev_preserved_flag'})
67 83 100       307 : $self->{'preserved_flag'};
68             }
69              
70             # Get preserved flag.
71             sub get {
72 89     89 1 154 my $self = shift;
73              
74             # Return preserved flags.
75             return wantarray
76             ? ($self->{'preserved_flag'}, $self->{'prev_preserved_flag'})
77 89 100       367 : $self->{'preserved_flag'};
78             }
79              
80             # Resets.
81             sub reset {
82 84     84 1 6217 my $self = shift;
83              
84             # Preserved flag.
85 84         159 $self->{'preserved_flag'} = 0;
86              
87             # Previsous preserved flag.
88 84         137 $self->{'prev_preserved_flag'} = 0;
89              
90             # Preserved elements.
91 84         167 $self->{'preserved_stack'} = [];
92              
93 84         126 return;
94             }
95              
96             # Save previous stay.
97             sub save_previous {
98 180     180 1 1995 my $self = shift;
99              
100 180         314 $self->{'prev_preserved_flag'} = $self->{'preserved_flag'};
101              
102 180         287 return;
103             }
104              
105             1;
106              
107             __END__