File Coverage

blib/lib/Template/Transformer.pm
Criterion Covered Total %
statement 62 81 76.5
branch 7 14 50.0
condition 2 2 100.0
subroutine 16 20 80.0
pod 0 2 0.0
total 87 119 73.1


line stmt bran cond sub pod time code
1 2     2   10 use strict;
  2         2  
  2         43  
2 2     2   14 use warnings;
  2         4  
  2         89  
3              
4             package Template::Transformer;
5             $Template::Transformer::VERSION = '1.16';
6             # ABSTRACT: Transformer used by Template::Resolver
7             # PODNAME: Template::Transformer
8              
9 2     2   10 use Carp;
  2         4  
  2         80  
10 2     2   960 use Data::Dumper;
  2         12037  
  2         112  
11 2     2   832 use Hash::Util qw(lock_hashref);
  2         4345  
  2         10  
12 2     2   134 use Log::Any;
  2         11  
  2         8  
13 2     2   849 use Safe;
  2         57742  
  2         1331  
14              
15             my $logger = Log::Any->get_logger();
16              
17             sub new {
18 13     13 0 40 return bless( {}, shift )->_init(@_);
19             }
20              
21             sub _boolean {
22 0     0   0 my ( $self, $value ) = @_;
23 0 0       0 return $self->_default($value) ? 'true' : 'false';
24             }
25              
26             sub _default {
27 27     27   46 my ( $self, $value ) = @_;
28 27         71 my ( $key, $default ) = split( /:/, $value, 2 );
29 27         59 my $return_value = $self->_property($key);
30 27 50       68 $return_value = $default unless ( defined($return_value) );
31 27 50       39 croak("undefined value without default, '$value'")
32             unless ( defined($return_value) );
33 27         62 return $return_value;
34             }
35              
36             sub _env {
37 0     0   0 my ( $self, $value ) = @_;
38 0         0 return $ENV{$value};
39             }
40              
41             sub _init {
42 13     13   29 my ( $self, $os, $properties, %options ) = @_;
43 13         37 $logger->debug( 'initializing transformer for ', $os );
44              
45 13         704 $self->{os} = $os;
46 13         24 $self->{properties} = $properties;
47              
48             $self->{wrapped_transforms} = {
49 13         38 'boolean' => $self->_wrap_transform( \&_boolean ),
50             'default' => $self->_wrap_transform( \&_default ),
51             'env' => $self->_wrap_transform( \&_env ),
52             'os_path' => $self->_wrap_transform( \&_os_path ),
53             'perl' => $self->_wrap_transform( \&_perl ),
54             'xml_escape' => $self->_wrap_transform( \&_xml_escape )
55             };
56 13 100       37 if ( $options{additional_transforms} ) {
57 1         2 foreach my $transform ( keys( %{ $options{additional_transforms} } ) ) {
  1         4  
58             $self->{wrapped_transforms}{$transform} =
59 1         2 $self->_wrap_transform( $options{additional_transforms}{$transform} );
60             }
61             }
62 13         48 lock_hashref( $self->{wrapped_transforms} );
63              
64 13         284 return $self;
65             }
66              
67             sub _safe_compartment {
68 6     6   9 my ($self) = @_;
69 6 100       13 if ( !$self->{safe_compartment} ) {
70 1         6 $self->{safe_compartment} = Safe->new();
71 1         927 *{ $self->{safe_compartment}->varglob('property') } =
  1         4  
72             $self->_wrap_transform( \&_property );
73 1         16 foreach my $transform ( keys( %{ $self->{wrapped_transforms} } ) ) {
  1         10  
74 6         10 *{ $self->{safe_compartment}->varglob($transform) } =
75 6         45 $self->{wrapped_transforms}{$transform};
76             }
77             }
78              
79 6         39 return $self->{safe_compartment};
80             }
81              
82             sub _property {
83 35     35   62 my ( $self, $key ) = @_;
84 35         123 return $self->{properties}{$key};
85             }
86              
87             sub _os_path {
88 0     0   0 my ( $self, $value ) = @_;
89 0         0 $value = $self->_default($value);
90 0 0       0 if ( $self->{os} eq 'cygwin' ) {
91 0         0 $value =~ s/\\/\\\\/g;
92 0         0 $value = `cygpath --absolute --mixed $value 2> /dev/null`;
93 0         0 chomp($value);
94             }
95 0         0 return $value;
96             }
97              
98             sub _perl {
99 6     6   12 my ( $self, $value ) = @_;
100 6         12 return $self->_safe_compartment()->reval($value);
101             }
102              
103             sub transform {
104 34     34 0 54 my ( $self, $value, $transform_name ) = @_;
105 34   100     106 $transform_name ||= 'default';
106 34         124 $logger->debug( 'applying [', $transform_name, '] to [', $value, ']' );
107              
108 34         2055 my $transform = $self->{wrapped_transforms}{$transform_name};
109 34 50       72 croak("unknown transform '$transform'") unless ($transform);
110 34         54 return &$transform($value);
111             }
112              
113             sub _xml_escape {
114 0     0   0 my ( $self, $value ) = @_;
115 0         0 $value = $self->_default($value);
116 0         0 $value =~ s/&/&/sg;
117 0         0 $value =~ s/
118 0         0 $value =~ s/>/>/sg;
119 0         0 $value =~ s/"/"/sg;
120 0         0 $value =~ s/'/'/sg;
121 0         0 return $value;
122             }
123              
124             sub _wrap_transform {
125 80     80   110 my ( $self, $transform ) = @_;
126             return sub {
127 38     38   632 &$transform( $self, @_ );
128             }
129 80         298 }
130              
131             1;
132              
133             __END__