File Coverage

blib/lib/PYX/Stack.pm
Criterion Covered Total %
statement 61 61 100.0
branch 10 10 100.0
condition 3 3 100.0
subroutine 12 12 100.0
pod 4 4 100.0
total 90 90 100.0


line stmt bran cond sub pod time code
1             package PYX::Stack;
2              
3 6     6   195526 use strict;
  6         37  
  6         235  
4 6     6   55 use warnings;
  6         10  
  6         468  
5              
6 6     6   1524 use Class::Utils qw(set_params);
  6         37707  
  6         214  
7 6     6   257 use Error::Pure qw(err);
  6         14  
  6         276  
8 6     6   2955 use PYX::Parser;
  6         125237  
  6         4779  
9              
10             our $VERSION = 0.06;
11              
12             # Constructor.
13             sub new {
14 15     15 1 1285167 my ($class, @params) = @_;
15 15         37 my $self = bless {}, $class;
16              
17             # Check bad end of element.
18 15         45 $self->{'bad_end'} = 0;
19              
20             # Output handler.
21 15         45 $self->{'output_handler'} = \*STDOUT;
22              
23             # Verbose.
24 15         27 $self->{'verbose'} = 0;
25              
26             # Process params.
27 15         55 set_params($self, @params);
28              
29             # PYX::Parser object.
30             $self->{'_pyx_parser'} = PYX::Parser->new(
31             'callbacks' => {
32             'end_element' => \&_end_element,
33             'start_element' => \&_start_element,
34             'final' => \&_final,
35             },
36             'non_parser_options' => {
37             'bad_end' => $self->{'bad_end'},
38             'stack' => [],
39             'verbose' => $self->{'verbose'},
40             },
41 13         238 'output_handler' => $self->{'output_handler'},
42             );
43              
44             # Object.
45 13         700 return $self;
46             }
47              
48             # Parse pyx text or array of pyx text.
49             sub parse {
50 4     4 1 1027 my ($self, $pyx, $out) = @_;
51 4         12 $self->{'_pyx_parser'}->parse($pyx, $out);
52 1         4 return;
53             }
54              
55             # Parse file with pyx text.
56             sub parse_file {
57 4     4 1 1709 my ($self, $file, $out) = @_;
58 4         17 $self->{'_pyx_parser'}->parse_file($file, $out);
59 1         23 return;
60             }
61              
62             # Parse from handler.
63             sub parse_handler {
64 4     4 1 1269 my ($self, $input_file_handler, $out) = @_;
65 4         14 $self->{'_pyx_parser'}->parse_handler($input_file_handler, $out);
66 1         3 return;
67             }
68              
69             # End of element.
70             sub _end_element {
71 15     15   1035 my ($pyx_parser_obj, $elem) = @_;
72 15         23 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
73 15 100       48 if ($stack_ar->[-1] eq $elem) {
    100          
74 9         11 pop @{$stack_ar};
  9         15  
75             } elsif ($pyx_parser_obj->{'non_parser_options'}->{'bad_end'}) {
76 3         11 err 'Bad end of element.',
77             'Element', $elem;
78             }
79 12 100 100     68 if ($pyx_parser_obj->{'non_parser_options'}->{'verbose'}
80 9         32 && @{$stack_ar} > 0) {
81              
82 6         9 my $out = $pyx_parser_obj->{'output_handler'};
83 6         7 print {$out} join('/', @{$stack_ar}), "\n";
  6         10  
  6         151  
84             }
85 12         28 return;
86             }
87              
88             # Finalize.
89             sub _final {
90 9     9   122 my $pyx_parser_obj = shift;
91 9         37 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
92 9 100       10 if (@{$stack_ar} > 0) {
  9         24  
93 6         54 err 'Stack has some elements.';
94             }
95 3         7 return;
96             }
97              
98             # Start of element.
99             sub _start_element {
100 24     24   2330 my ($pyx_parser_obj, $elem) = @_;
101 24         36 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
102 24         34 my $out = $pyx_parser_obj->{'output_handler'};
103 24         28 push @{$stack_ar}, $elem;
  24         45  
104 24 100       62 if ($pyx_parser_obj->{'non_parser_options'}->{'verbose'}) {
105 9         11 print {$out} join('/', @{$stack_ar}), "\n";
  9         13  
  9         371  
106             }
107 24         57 return;
108             }
109              
110             1;
111              
112             __END__