File Coverage

blib/lib/MetaPOD/Assembler.pm
Criterion Covered Total %
statement 39 49 79.5
branch 2 4 50.0
condition n/a
subroutine 12 15 80.0
pod 5 5 100.0
total 58 73 79.4


line stmt bran cond sub pod time code
1 2     2   18010 use 5.006; # our
  2         4  
2 2     2   8 use strict;
  2         2  
  2         36  
3 2     2   13 use warnings;
  2         2  
  2         130  
4              
5             package MetaPOD::Assembler;
6              
7             our $VERSION = 'v0.4.0';
8              
9             # ABSTRACT: Glue layer that dispatches segments to a constructed Result
10              
11             our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
12              
13              
14              
15              
16              
17              
18              
19              
20              
21              
22              
23              
24              
25              
26              
27              
28              
29              
30              
31              
32              
33              
34              
35              
36              
37              
38              
39              
40              
41              
42              
43              
44              
45 2     2   916 use Moo qw( has );
  2         75552  
  2         9  
46 2     2   2124 use Carp qw( croak );
  2         3  
  2         75  
47 2     2   6 use Module::Runtime qw( use_module );
  2         3  
  2         10  
48              
49              
50              
51              
52              
53             has 'result' => (
54             is => ro =>,
55             required => 0,
56             lazy => 1,
57             builder => sub {
58 2     2   2191 require MetaPOD::Result;
59 2         22 return MetaPOD::Result->new();
60             },
61             clearer => 'clear_result',
62             );
63              
64              
65              
66              
67              
68             has extractor => (
69             is => ro =>,
70             required => 1,
71             lazy => 1,
72             builder => sub {
73 2     2   1301 my $self = shift;
74 2         478 require MetaPOD::Extractor;
75             return MetaPOD::Extractor->new(
76             end_segment_callback => sub {
77 1     1   1 my $segment = shift;
78 1         3 $self->handle_segment($segment);
79             },
80 2         29 );
81             },
82             );
83              
84              
85              
86              
87              
88             has format_map => (
89             is => ro =>,
90             required => 1,
91             lazy => 1,
92             builder => sub {
93 0     0   0 return { 'JSON' => 'MetaPOD::Format::JSON', };
94             },
95             );
96              
97              
98              
99              
100              
101              
102              
103             sub assemble_handle {
104 0     0 1 0 my ( $self, $handle ) = @_;
105 0         0 $self->clear_result;
106 0         0 $self->extractor->read_handle($handle);
107 0         0 return $self->result;
108             }
109              
110              
111              
112              
113              
114              
115              
116             sub assemble_file {
117 1     1 1 697 my ( $self, $file ) = @_;
118 1         17 $self->clear_result;
119 1         16 $self->extractor->read_file($file);
120 1         117 return $self->result;
121             }
122              
123              
124              
125              
126              
127              
128              
129             sub assemble_string {
130 0     0 1 0 my ( $self, $string ) = @_;
131 0         0 $self->clear_result;
132 0         0 $self->extractor->read_string($string);
133 0         0 return $self->result;
134             }
135              
136              
137              
138              
139              
140              
141              
142             sub get_class_for_format {
143 1     1 1 2 my ( $self, $format ) = @_;
144 1 50       14 if ( not exists $self->format_map->{$format} ) {
145 0         0 croak "format $format unsupported";
146             }
147 1         19 return $self->format_map->{$format};
148             }
149              
150              
151              
152              
153              
154              
155              
156              
157              
158              
159              
160              
161              
162              
163             sub handle_segment {
164 1     1 1 2 my ( $self, $segment ) = @_;
165 1         1 my $format = $segment->{format};
166 1         1 my $version = $segment->{version};
167              
168 1         3 my $class = $self->get_class_for_format($format);
169 1         7 use_module($class);
170              
171 1 50       23 return unless $class->supports_version($version);
172              
173 1         15 $class->add_segment( $segment, $self->result );
174              
175 1         21 return $self;
176             }
177              
178             1;
179              
180             __END__