File Coverage

blib/lib/PYX/Hist.pm
Criterion Covered Total %
statement 63 63 100.0
branch 8 8 100.0
condition n/a
subroutine 14 14 100.0
pod 4 4 100.0
total 89 89 100.0


line stmt bran cond sub pod time code
1             package PYX::Hist;
2              
3 6     6   220976 use strict;
  6         52  
  6         165  
4 6     6   29 use warnings;
  6         13  
  6         191  
5              
6 6     6   1894 use Class::Utils qw(set_params);
  6         37947  
  6         166  
7 6     6   305 use Error::Pure qw(err);
  6         11  
  6         221  
8 6     6   53 use List::Util qw(reduce);
  6         11  
  6         263  
9 6     6   2926 use PYX::Parser;
  6         79569  
  6         3807  
10              
11             our $VERSION = 0.06;
12              
13             # Constructor.
14             sub new {
15 12     12 1 19925 my ($class, @params) = @_;
16 12         32 my $self = bless {}, $class;
17              
18             # Output handler.
19 12         44 $self->{'output_handler'} = \*STDOUT;
20              
21             # Process params.
22 12         45 set_params($self, @params);
23              
24             # PYX::Parser object.
25             $self->{'_pyx_parser'} = PYX::Parser->new(
26             'callbacks' => {
27             'end_element' => \&_end_element,
28             'final' => \&_final,
29             'start_element' => \&_start_element,
30             },
31             'non_parser_options' => {
32             'hist' => {},
33             'stack' => [],
34             },
35 10         153 'output_handler' => $self->{'output_handler'},
36             );
37              
38             # Object.
39 10         568 return $self;
40             }
41              
42             # Parse pyx text or array of pyx text.
43             sub parse {
44 3     3 1 1880 my ($self, $pyx, $out) = @_;
45 3         12 $self->{'_pyx_parser'}->parse($pyx, $out);
46 1         13 return;
47             }
48              
49             # Parse file with pyx text.
50             sub parse_file {
51 3     3 1 1661 my ($self, $file, $out) = @_;
52 3         11 $self->{'_pyx_parser'}->parse_file($file, $out);
53 1         21 return;
54             }
55              
56             # Parse from handler.
57             sub parse_handler {
58 3     3 1 1791 my ($self, $input_file_handler, $out) = @_;
59 3         14 $self->{'_pyx_parser'}->parse_handler($input_file_handler, $out);
60 1         5 return;
61             }
62              
63             # End of element.
64             sub _end_element {
65 12     12   902 my ($pyx_parser_obj, $elem) = @_;
66 12         57 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
67 12 100       38 if ($stack_ar->[-1] eq $elem) {
68 9         14 pop @{$stack_ar};
  9         15  
69             } else {
70 3         15 err 'Bad end of element.',
71             'Element', $elem;
72             }
73 9         20 return;
74             }
75              
76             # Finalize.
77             sub _final {
78 6     6   123 my $pyx_parser_obj = shift;
79 6         13 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
80 6 100       8 if (@{$stack_ar} > 0) {
  6         47  
81 3         14 err 'Stack has some elements.';
82             }
83 3         11 my $hist_hr = $pyx_parser_obj->{'non_parser_options'}->{'hist'};
84 3 100   3   20 my $max_len = length reduce { length($a) > length($b) ? $a : $b }
85 3         25 keys %{$hist_hr};
  3         32  
86 3         15 my $out = $pyx_parser_obj->{'output_handler'};
87 3         7 foreach my $key (sort keys %{$hist_hr}) {
  3         18  
88 6         15 printf {$out} "[ %-${max_len}s ] %s\n", $key, $hist_hr->{$key};
  6         263  
89             }
90 3         17 return;
91             }
92              
93             # Start of element.
94             sub _start_element {
95 18     18   1823 my ($pyx_parser_obj, $elem) = @_;
96 18         34 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
97 18         23 push @{$stack_ar}, $elem;
  18         39  
98 18 100       55 if (! $pyx_parser_obj->{'non_parser_options'}->{'hist'}->{$elem}) {
99 15         32 $pyx_parser_obj->{'non_parser_options'}->{'hist'}->{$elem} = 1;
100             } else {
101 3         5 $pyx_parser_obj->{'non_parser_options'}->{'hist'}->{$elem}++;
102             }
103 18         39 return;
104             }
105              
106             1;
107              
108             __END__