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         7  
3 2     2   9 use warnings;
  2         5  
  2         193  
4             { our $VERSION = '0.003' }
5              
6 2     2   13 use Carp;
  2         4  
  2         210  
7 2     2   11 use JSON::PP qw< decode_json >;
  2         25  
  2         129  
8 2     2   11 use Scalar::Util qw< blessed >;
  2         31  
  2         105  
9 2     2   11 use PDF::Collage::Template ();
  2         5  
  2         38  
10              
11 2     2   8 use Moo;
  2         4  
  2         15  
12 2     2   876 use experimental qw< signatures >;
  2         3  
  2         18  
13              
14 2     2   391 use namespace::clean;
  2         4  
  2         31  
15              
16             has resolver => (is => ro => required => 1 => coerce => \&__resolver);
17             has _selectors => (is => 'lazy');
18              
19 6     6   69 sub _build__selectors ($self) {
  6         15  
  6         13  
20             my @selectors =
21 9         53 map { s{\.json}{}rmxs }
22 6         60 grep { m{\.json \z}mxs }
  12         106341  
23             $self->resolver->get_sub_resolver('definitions')->list_asset_keys;
24 6         267 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 7509 sub get ($self, $selector) {
  21         56  
  21         43  
  21         53  
30 21 100       78 $selector = $self->_selector_from($selector)
31             or croak 'invalid selector';
32              
33 19         77 my $resolver = $self->resolver;
34              
35             # my $def = $resolver->get_sub_resolver('definitions')
36             # ->get_asset("$selector.json")->parsed_as_json;
37 19         176 my $def = $resolver->get_asset("./definitions/$selector.json")->parsed_as_json;
38              
39 19 50       152749 $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   449 as_file => sub ($key) { $resolver->get_asset($key)->file },
  49         86157  
  49         150  
  49         86  
44 19         282 };
45              
46 19         850 return PDF::Collage::Template->new($def);
47             }
48              
49 12     12 1 19171 sub render ($self, $selector = undef, $data = undef) {
  12         30  
  12         31  
  12         25  
  12         22  
50 12 100       92 ($selector, $data) = ($data, $selector) if ref($selector);
51 12         58 return $self->get($selector)->render($data);
52             }
53              
54             # coercion function to get a Data::Resolver CDDE reference back
55 6     6   2400 sub __resolver ($candidate) {
  6         13  
  6         13  
56 6 100       47 return $candidate if blessed($candidate);
57 5         14 my $class = $candidate->{class};
58 5         45 my $path = "$class.pm" =~ s{::}{/}rgmxs;
59 5         50 require $path;
60 5         146 return $class->new($candidate->%*);
61             }
62              
63 21     21   36 sub _selector_from ($self, $selector) {
  21         44  
  21         43  
  21         32  
64 21         917 my $sels = $self->_selectors;
65 21 100 66     310 $selector //= $sels->[0] if $sels->@* == 1;
66 21 100       85 return undef unless defined $selector;
67 20         50 my @candidates = grep { $selector eq $_ } $sels->@*;
  32         106  
68 20 100       164 return @candidates ? $candidates[0] : undef;
69             }
70              
71 6     6 1 9526 sub selectors ($self) { $self->_selectors->@* }
  6         15  
  6         14  
  6         254  
72              
73             1;