File Coverage

blib/lib/Config/Any/JSON.pm
Criterion Covered Total %
statement 23 46 50.0
branch 2 18 11.1
condition n/a
subroutine 6 6 100.0
pod 3 3 100.0
total 34 73 46.5


line stmt bran cond sub pod time code
1             package Config::Any::JSON;
2              
3 5     5   4530 use strict;
  5         13  
  5         143  
4 5     5   24 use warnings;
  5         9  
  5         149  
5              
6 5     5   25 use base 'Config::Any::Base';
  5         9  
  5         2521  
7              
8             =head1 NAME
9              
10             Config::Any::JSON - Load JSON config files
11              
12             =head1 DESCRIPTION
13              
14             Loads JSON files. Example:
15              
16             {
17             "name": "TestApp",
18             "Controller::Foo": {
19             "foo": "bar"
20             },
21             "Model::Baz": {
22             "qux": "xyzzy"
23             }
24             }
25              
26             =head1 METHODS
27              
28             =head2 extensions( )
29              
30             return an array of valid extensions (C, C).
31              
32             =cut
33              
34             sub extensions {
35 10     10 1 31 return qw( json jsn );
36             }
37              
38             =head2 load( $file )
39              
40             Attempts to load C<$file> as a JSON file.
41              
42             =cut
43              
44             sub load {
45 5     5 1 1847 my $class = shift;
46 5         12 my $file = shift;
47              
48 5 50       221 open( my $fh, '<', $file ) or die $!;
49 5         20 binmode $fh;
50 5         9 my $content = do { local $/; <$fh> };
  5         20  
  5         579  
51 5         53 close $fh;
52              
53 5 50       18 if ( eval { require Cpanel::JSON::XS } ) {
  5 0       40  
    0          
    0          
    0          
    0          
54 5         63 my $decoder = Cpanel::JSON::XS->new->utf8->relaxed;
55 5         113 return $decoder->decode( $content );
56             }
57 0         0 elsif ( eval { require JSON::MaybeXS } ) {
58 0         0 my $decoder = JSON::MaybeXS::JSON()->new->utf8->relaxed;
59 0         0 return $decoder->decode( $content );
60             }
61 0         0 elsif ( eval { require JSON::DWIW } ) {
62 0         0 my $decoder = JSON::DWIW->new;
63 0         0 my ( $data, $error ) = $decoder->from_json( $content );
64 0 0       0 die $error if $error;
65 0         0 return $data;
66             }
67 0         0 elsif ( eval { require JSON::XS } ) {
68 0         0 my $decoder = JSON::XS->new->utf8->relaxed;
69 0         0 return $decoder->decode( $content );
70             }
71 0         0 elsif ( eval { require JSON::Syck } ) {
72 0         0 require Encode;
73 0         0 return JSON::Syck::Load( Encode::decode('UTF-8', $content ) );
74             }
75 0         0 elsif ( eval { require JSON::PP; JSON::PP->VERSION( 2 ); } ) {
  0         0  
76 0         0 my $decoder = JSON::PP->new->utf8->relaxed;
77 0         0 return $decoder->decode( $content );
78             }
79 0         0 require JSON;
80 0 0       0 if ( eval { JSON->VERSION( 2 ) } ) {
  0         0  
81 0         0 return JSON::decode_json( $content );
82             }
83             else {
84 0         0 return JSON::jsonToObj( $content );
85             }
86             }
87              
88             =head2 requires_any_of( )
89              
90             Specifies that this modules requires one of, L,
91             L, L, L, L, L or
92             L in order to work.
93              
94             =cut
95              
96 5     5 1 31 sub requires_any_of { qw(
97             Cpanel::JSON::XS
98             JSON::MaybeXS
99             JSON::DWIW
100             JSON::XS
101             JSON::Syck
102             JSON::PP
103             JSON
104             ) }
105              
106             =head1 AUTHOR
107              
108             Brian Cassidy
109              
110             =head1 COPYRIGHT AND LICENSE
111              
112             Copyright 2006-2016 by Brian Cassidy
113              
114             This library is free software; you can redistribute it and/or modify
115             it under the same terms as Perl itself.
116              
117             =head1 SEE ALSO
118              
119             =over 4
120              
121             =item * L
122              
123             =item * L
124              
125             =item * L
126              
127             =item * L
128              
129             =item * L
130              
131             =item * L
132              
133             =item * L
134              
135             =item * L
136              
137             =back
138              
139             =cut
140              
141             1;