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   327127 use strict;
  6         12  
  6         233  
4 6     6   35 use warnings;
  6         19  
  6         348  
5              
6 6     6   3468 use Class::Utils qw(set_params);
  6         41268  
  6         241  
7 6     6   374 use Error::Pure qw(err);
  6         13  
  6         357  
8 6     6   37 use List::Util qw(reduce);
  6         14  
  6         393  
9 6     6   3426 use PYX::Parser;
  6         143027  
  6         4841  
10              
11             our $VERSION = 0.08;
12              
13             # Constructor.
14             sub new {
15 12     12 1 1352828 my ($class, @params) = @_;
16 12         48 my $self = bless {}, $class;
17              
18             # Output handler.
19 12         55 $self->{'output_handler'} = \*STDOUT;
20              
21             # Process params.
22 12         69 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         187 'output_handler' => $self->{'output_handler'},
36             );
37              
38             # Object.
39 10         760 return $self;
40             }
41              
42             # Parse pyx text or array of pyx text.
43             sub parse {
44 3     3 1 2216 my ($self, $pyx, $out) = @_;
45 3         14 $self->{'_pyx_parser'}->parse($pyx, $out);
46 1         9 return;
47             }
48              
49             # Parse file with pyx text.
50             sub parse_file {
51 3     3 1 2218 my ($self, $file, $out) = @_;
52 3         14 $self->{'_pyx_parser'}->parse_file($file, $out);
53 1         24 return;
54             }
55              
56             # Parse from handler.
57             sub parse_handler {
58 3     3 1 2516 my ($self, $input_file_handler, $out) = @_;
59 3         17 $self->{'_pyx_parser'}->parse_handler($input_file_handler, $out);
60 1         7 return;
61             }
62              
63             # End of element.
64             sub _end_element {
65 12     12   1004 my ($pyx_parser_obj, $elem) = @_;
66 12         29 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
67 12 100       52 if ($stack_ar->[-1] eq $elem) {
68 9         17 pop @{$stack_ar};
  9         18  
69             } else {
70 3         17 err 'Bad end of element.',
71             'Element', $elem;
72             }
73 9         22 return;
74             }
75              
76             # Finalize.
77             sub _final {
78 6     6   124 my $pyx_parser_obj = shift;
79 6         19 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
80 6 100       11 if (@{$stack_ar} > 0) {
  6         29  
81 3         25 err 'Stack has some elements.';
82             }
83 3         8 my $hist_hr = $pyx_parser_obj->{'non_parser_options'}->{'hist'};
84 3 100   3   26 my $max_len = length reduce { length($a) > length($b) ? $a : $b }
85 3         19 keys %{$hist_hr};
  3         40  
86 3         38 my $out = $pyx_parser_obj->{'output_handler'};
87 3         7 foreach my $key (sort keys %{$hist_hr}) {
  3         17  
88 6         17 printf {$out} "[ %-${max_len}s ] %s\n", $key, $hist_hr->{$key};
  6         375  
89             }
90 3         20 return;
91             }
92              
93             # Start of element.
94             sub _start_element {
95 18     18   2089 my ($pyx_parser_obj, $elem) = @_;
96 18         44 my $stack_ar = $pyx_parser_obj->{'non_parser_options'}->{'stack'};
97 18         31 push @{$stack_ar}, $elem;
  18         46  
98 18 100       62 if (! $pyx_parser_obj->{'non_parser_options'}->{'hist'}->{$elem}) {
99 15         44 $pyx_parser_obj->{'non_parser_options'}->{'hist'}->{$elem} = 1;
100             } else {
101 3         8 $pyx_parser_obj->{'non_parser_options'}->{'hist'}->{$elem}++;
102             }
103 18         48 return;
104             }
105              
106             1;
107              
108             __END__