File Coverage

blib/lib/Validation/Class/Plugin/JavascriptObjects.pm
Criterion Covered Total %
statement 12 43 27.9
branch 0 10 0.0
condition 0 4 0.0
subroutine 4 8 50.0
pod 1 4 25.0
total 17 69 24.6


line stmt bran cond sub pod time code
1             # ABSTRACT: Javascript Object Rendering for Validation::Class
2              
3             package Validation::Class::Plugin::JavascriptObjects;
4              
5 1     1   30363 use strict;
  1         2  
  1         40  
6 1     1   6 use warnings;
  1         2  
  1         39  
7              
8 1     1   1377 use JSON -convert_blessed_universally;
  1         19476  
  1         8  
9              
10 1     1   1437 use Validation::Class::Util;
  1         4729  
  1         8  
11              
12             our $VERSION = '7.900021'; # VERSION
13              
14              
15             sub new {
16              
17 0     0 0   my $class = shift;
18 0           my $prototype = shift;
19              
20 0           my $self = {prototype => $prototype};
21              
22 0           return bless $self, $class;
23              
24             }
25              
26             sub proto {
27              
28 0     0 0   goto &prototype;
29              
30             }
31              
32             sub prototype {
33              
34 0     0 0   my ($self) = @_;
35              
36 0           return $self->{prototype};
37              
38             }
39              
40              
41             sub render {
42              
43 0     0 1   my ($self, %options) = @_;
44              
45 0           my $model = $self->prototype;
46 0   0       my $namespace = $options{namespace} || $model->package || 'object';
47 0           my $next = my $root = {};
48              
49 0           $next = $next->{$_} = {} for split /\W+/, $namespace;
50              
51 0 0         my @fields = isa_arrayref($options{fields}) ?
52 0 0         map { $model->fields->get($_) || () } @{$options{fields}} :
  0            
53             $model->fields->values
54             ;
55              
56 0           foreach my $field (@fields) {
57              
58 0 0         my %data = map {
59             # automatically excludes validation, etc
60 0           isa_coderef($field->{$_}) ? () : ($_ => $field->{$_})
61             } $field->keys;
62              
63 0           my $name = $field->name;
64              
65 0 0         if (isa_arrayref $options{include}) {
66 0           %data = map { $_ => $data{$_} } @{$options{include}};
  0            
  0            
67             }
68              
69 0 0         if (isa_arrayref $options{exclude}) {
70 0           delete $data{$_} for @{$options{exclude}};
  0            
71             }
72              
73 0   0       $next->{$name} ||= {%data};
74              
75             }
76              
77             # generate the JS object
78 0           my @data = each(%{$root});
  0            
79 0           my $data = sprintf 'var %s = %s;', $data[0], JSON->new
80              
81             ->allow_nonref
82             ->allow_blessed
83             ->convert_blessed
84             ->utf8->pretty
85             ->encode($data[1])
86              
87             ;
88              
89 0           return $data;
90              
91             }
92              
93             1;
94              
95             __END__