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             # Pragmas.
4 7     7   101707 use strict;
  7         14  
  7         259  
5 7     7   32 use warnings;
  7         11  
  7         222  
6              
7             # Modules.
8 7     7   1837 use Class::Utils qw(set_params);
  7         77138  
  7         240  
9 7     7   272 use Error::Pure qw(err);
  7         12  
  7         255  
10 7     7   3689 use PYX::Parser;
  7         7934  
  7         3728  
11              
12             # Version.
13             our $VERSION = 0.03;
14              
15             # Constructor.
16             sub new {
17 15     15 1 18832 my ($class, @params) = @_;
18 15         37 my $self = bless {}, $class;
19              
20             # Check bad end of element.
21 15         38 $self->{'bad_end'} = 0;
22              
23             # Output handler.
24 15         30 $self->{'output_handler'} = \*STDOUT;
25              
26             # Verbose.
27 15         21 $self->{'verbose'} = 0;
28              
29             # Process params.
30 15         43 set_params($self, @params);
31              
32             # PYX::Parser object.
33 13         182 $self->{'_pyx_parser'} = PYX::Parser->new(
34             'callbacks' => {
35             'end_element' => \&_end_element,
36             'start_element' => \&_start_element,
37             'final' => \&_final,
38             },
39             'non_parser_options' => {
40             'bad_end' => $self->{'bad_end'},
41             'stack' => [],
42             'verbose' => $self->{'verbose'},
43             },
44             'output_handler' => $self->{'output_handler'},
45             );
46              
47             # Object.
48 13         463 return $self;
49             }
50              
51             # Parse pyx text or array of pyx text.
52             sub parse {
53 4     4 1 920 my ($self, $pyx, $out) = @_;
54 4         11 $self->{'_pyx_parser'}->parse($pyx, $out);
55 1         3 return;
56             }
57              
58             # Parse file with pyx text.
59             sub parse_file {
60 4     4 1 1039 my ($self, $file, $out) = @_;
61 4         15 $self->{'_pyx_parser'}->parse_file($file, $out);
62 1         12 return;
63             }
64              
65             # Parse from handler.
66             sub parse_handler {
67 4     4 1 1180 my ($self, $input_file_handler, $out) = @_;
68 4         11 $self->{'_pyx_parser'}->parse_handler($input_file_handler, $out);
69 1         2 return;
70             }
71              
72             # End of element.
73             sub _end_element {
74 15     15   315 my ($pyx_parser_obj, $elem) = @_;
75 15         24 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
76 15 100       39 if ($stack_ar->[-1] eq $elem) {
    100          
77 9         10 pop @{$stack_ar};
  9         11  
78             } elsif ($pyx_parser_obj->{'non_parser_options'}->{'bad_end'}) {
79 3         10 err 'Bad end of element.',
80             'Element', $elem;
81             }
82 12 100 100     35 if ($pyx_parser_obj->{'non_parser_options'}->{'verbose'}
  9         33  
83             && @{$stack_ar} > 0) {
84              
85 6         8 my $out = $pyx_parser_obj->{'output_handler'};
86 6         6 print {$out} join('/', @{$stack_ar}), "\n";
  6         7  
  6         46  
87             }
88 12         21 return;
89             }
90              
91             # Finalize.
92             sub _final {
93 9     9   79 my $pyx_parser_obj = shift;
94 9         15 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
95 9 100       9 if (@{$stack_ar} > 0) {
  9         27  
96 6         19 err 'Stack has some elements.';
97             }
98 3         6 return;
99             }
100              
101             # Start of element.
102             sub _start_element {
103 24     24   776 my ($pyx_parser_obj, $elem) = @_;
104 24         32 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
105 24         27 my $out = $pyx_parser_obj->{'output_handler'};
106 24         22 push @{$stack_ar}, $elem;
  24         28  
107 24 100       51 if ($pyx_parser_obj->{'non_parser_options'}->{'verbose'}) {
108 9         10 print {$out} join('/', @{$stack_ar}), "\n";
  9         10  
  9         204  
109             }
110 24         43 return;
111             }
112              
113             1;
114              
115             __END__