File Coverage

blib/lib/PDF/Collage/TemplatesCollection.pm
Criterion Covered Total %
statement 76 85 89.4
branch 13 14 92.8
condition 2 3 66.6
subroutine 16 18 88.8
pod 4 4 100.0
total 111 124 89.5


line stmt bran cond sub pod time code
1             package PDF::Collage::TemplatesCollection;
2 2     2   32 use v5.24;
  2         10  
3 2     2   11 use warnings;
  2         8  
  2         86  
4             { our $VERSION = '0.001001' }
5              
6 2     2   10 use Carp;
  2         7  
  2         162  
7 2     2   31 use JSON::PP qw< decode_json >;
  2         5  
  2         107  
8 2     2   23 use Scalar::Util qw< blessed >;
  2         21  
  2         95  
9 2     2   21 use PDF::Collage::Template ();
  2         5  
  2         35  
10              
11 2     2   22 use Moo;
  2         5  
  2         11  
12 2     2   813 use experimental qw< signatures >;
  2         5  
  2         12  
13              
14 2     2   263 use namespace::clean;
  2         5  
  2         34  
15              
16             has resolver => (is => ro => required => 1 => coerce => \&__resolver);
17             has _selectors => (is => 'lazy');
18              
19 6     6   79 sub _build__selectors ($self) {
  6         11  
  6         12  
20             my @selectors =
21 9         52 map { s{\.json}{}rmxs }
22 6         51 grep { m{\.json \z}mxs }
  12         72474  
23             $self->resolver->get_sub_resolver('definitions')->list_asset_keys;
24 6         198 return \@selectors;
25             } ## end sub _build__selectors
26              
27 0     0 1 0 sub contains ($self, $sel) { defined($self->_selector_from($sel)) }
  0         0  
  0         0  
  0         0  
  0         0  
28              
29 21     21 1 5650 sub get ($self, $selector) {
  21         53  
  21         45  
  21         37  
30 21 100       96 $selector = $self->_selector_from($selector)
31             or croak 'invalid selector';
32              
33 19         87 my $resolver = $self->resolver;
34              
35             # my $def = $resolver->get_sub_resolver('definitions')
36             # ->get_asset("$selector.json")->parsed_as_json;
37 19         117 my $def = $resolver->get_asset("./definitions/$selector.json")->parsed_as_json;
38              
39 19 50       132079 $def = { commands => $def } unless ref($def) eq 'HASH';
40              
41             $def->{functions} = {
42 0     0   0 as_data => sub ($key) { $resolver->get_asset($key)->raw_data },
  0         0  
  0         0  
  0         0  
43 49     49   76 as_file => sub ($key) { $resolver->get_asset($key)->file },
  49         194  
  49         67745  
  49         111  
44 19         223 };
45              
46 19         600 return PDF::Collage::Template->new($def);
47             }
48              
49 12     12 1 12381 sub render ($self, $selector = undef, $data = undef) {
  12         36  
  12         29  
  12         26  
  12         33  
50 12 100       55 ($selector, $data) = ($data, $selector) if ref($selector);
51 12         50 return $self->get($selector)->render($data);
52             }
53              
54             # coercion function to get a Data::Resolver CDDE reference back
55 6     6   1984 sub __resolver ($candidate) {
  6         18  
  6         10  
56 6 100       56 return $candidate if blessed($candidate);
57 5         16 my $class = $candidate->{class};
58 5         47 my $path = "$class.pm" =~ s{::}{/}rgmxs;
59 5         40 require $path;
60 5         119 return $class->new($candidate->%*);
61             }
62              
63 21     21   43 sub _selector_from ($self, $selector) {
  21         37  
  21         40  
  21         42  
64 21         525 my $sels = $self->_selectors;
65 21 100 66     330 $selector //= $sels->[0] if $sels->@* == 1;
66 21 100       84 return undef unless defined $selector;
67 20         53 my @candidates = grep { $selector eq $_ } $sels->@*;
  32         110  
68 20 100       132 return @candidates ? $candidates[0] : undef;
69             }
70              
71 6     6 1 7105 sub selectors ($self) { $self->_selectors->@* }
  6         14  
  6         11  
  6         149  
72              
73             1;