File Coverage

blib/lib/EJS/Template/Executor.pm
Criterion Covered Total %
statement 40 43 93.0
branch 4 6 66.6
condition 2 3 66.6
subroutine 10 10 100.0
pod 2 2 100.0
total 58 64 90.6


line stmt bran cond sub pod time code
1 8     8   126 use 5.006;
  8         25  
2 8     8   55 use strict;
  8         15  
  8         152  
3 8     8   40 use warnings;
  8         11  
  8         336  
4              
5             =head1 NAME
6              
7             EJS::Template::Executor - Executes JavaScript generated by EJS::Template
8              
9             =cut
10              
11             package EJS::Template::Executor;
12 8     8   46 use base qw(EJS::Template::Base EJS::Template::IO);
  8         15  
  8         3341  
13              
14 8     8   3027 use EJS::Template::JSAdapter;
  8         35  
  8         241  
15 8     8   3152 use EJS::Template::Runtime;
  8         18  
  8         2673  
16              
17             =head1 Methods
18              
19             =head2 execute
20              
21             Executes JavaScript code.
22              
23             $executor->execute($input, $variables, $output);
24              
25             The C<$input> is used as the JavaScript source code, C<$variables> is a hash
26             ref of variables for JavaScript, and C<$output> is the output destination
27              
28             =cut
29              
30             sub execute {
31 63     63 1 209 my ($self, $input, $variables, $output) = @_;
32            
33 63         110 my $js;
34              
35             $self->input($input, sub {
36 63     63   183 my ($in) = @_;
37 63         248 local $/;
38 63         214 $js = <$in>;
39 63         459 });
40              
41 63         721 my $ret;
42              
43             $self->output($output, sub {
44 63     63   162 my ($out) = @_;
45              
46 63         368 my $runtime = EJS::Template::Runtime->new($self);
47 63         252 my $adapter = $self->adapter;
48 63         652 $adapter->bind({print => sub { print $out @_ }});
  160         237668  
49 63         411 $adapter->bind({EJS => $runtime->make_map()});
50 63         309 $adapter->bind($variables);
51              
52 63 100       208 if (defined($js)) {
53 62         311 $ret = $adapter->eval($js);
54 62 50       8803 die $@ if $@;
55             } else {
56 1         18 $ret = 1;
57             }
58 63         515 });
59            
60 63         271 return $ret;
61             }
62              
63             =head2 adapter
64              
65             Usage:
66              
67             # Getter
68             $executor->adapter;
69              
70             # Setter
71             $executor->adapter(EJS::Template::JSAdapter->create('JE'));
72              
73             Gets or sets an C object.
74              
75             =cut
76              
77             sub adapter {
78 68     68 1 117 my $self = shift;
79              
80 68 50       218 if (@_) {
81 0         0 my $old = $self->{adapter};
82 0         0 $self->{adapter} = shift;
83 0         0 return $old;
84             } else {
85 68   66     559 return $self->{adapter} ||= EJS::Template::JSAdapter->create($self->{config}{engine});
86             }
87             }
88              
89              
90             =head1 SEE ALSO
91              
92             =over 4
93              
94             =item * L
95              
96             =back
97              
98             =cut
99              
100             1;