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   71935 use strict;
  26         69  
  26         645  
4 26     26   1905 use warnings;
  26         41  
  26         728  
5              
6 26     26   1606 use Class::Utils qw(set_params);
  26         94453  
  26         1124  
7 26     26   383 use List::MoreUtils qw(any);
  26         51  
  26         133  
8 26     26   15105 use Readonly;
  26         45  
  26         11847  
9              
10             # Constants.
11             Readonly::Scalar my $LAST_INDEX => -1;
12              
13             our $VERSION = 0.12;
14              
15             # Constructor.
16             sub new {
17 81     81 1 5748 my ($class, @params) = @_;
18 81         150 my $self = bless {}, $class;
19              
20             # Preserved tags.
21 81         194 $self->{'preserved'} = [];
22              
23             # Process params.
24 81         252 set_params($self, @params);
25              
26             # Initialization.
27 79         943 $self->reset;
28              
29             # Object.
30 79         218 return $self;
31             }
32              
33             # Process for begin of tag.
34             sub begin {
35 96     96 1 6199 my ($self, $tag) = @_;
36              
37 96         192 $self->save_previous;
38 96 100 100     125 if (scalar @{$self->{'preserved'}}
  96         271  
39 17     17   52 && any { $tag eq $_ } @{$self->{'preserved'}}) {
  17         47  
40              
41 8         8 push @{$self->{'preserved_stack'}}, $tag;
  8         16  
42 8         10 $self->{'preserved_flag'} = 1;
43             }
44              
45             # Return preserved flags.
46             return wantarray
47             ? ($self->{'preserved_flag'}, $self->{'prev_preserved_flag'})
48 96 100       257 : $self->{'preserved_flag'};
49             }
50              
51             # Process for end of tag.
52             sub end {
53 83     83 1 5732 my ($self, $tag) = @_;
54              
55 83         165 $self->save_previous;
56 83         101 my $stack = $self->{'preserved_stack'};
57 83 100 100     97 if (scalar @{$stack} && $tag eq $stack->[$LAST_INDEX]) {
  83         216  
58 6         7 pop @{$stack};
  6         10  
59 6 50       8 if (! scalar @{$stack}) {
  6         11  
60 6         10 $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       202 : $self->{'preserved_flag'};
68             }
69              
70             # Get preserved flag.
71             sub get {
72 89     89 1 131 my $self = shift;
73              
74             # Return preserved flags.
75             return wantarray
76             ? ($self->{'preserved_flag'}, $self->{'prev_preserved_flag'})
77 89 100       270 : $self->{'preserved_flag'};
78             }
79              
80             # Resets.
81             sub reset {
82 83     83 1 3620 my $self = shift;
83              
84             # Preserved flag.
85 83         131 $self->{'preserved_flag'} = 0;
86              
87             # Previsous preserved flag.
88 83         128 $self->{'prev_preserved_flag'} = 0;
89              
90             # Preserved tag.
91 83         140 $self->{'preserved_stack'} = [];
92              
93 83         126 return;
94             }
95              
96             # Save previous stay.
97             sub save_previous {
98 180     180 1 1212 my $self = shift;
99              
100 180         241 $self->{'prev_preserved_flag'} = $self->{'preserved_flag'};
101              
102 180         218 return;
103             }
104              
105             1;
106              
107             __END__