properly document JSON modules used
[p5sagit/Config-Any.git] / lib / Config / Any / JSON.pm
1 package Config::Any::JSON;
2
3 use strict;
4 use warnings;
5
6 use base 'Config::Any::Base';
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<json>, C<jsn>).
31
32 =cut
33
34 sub extensions {
35     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     my $class = shift;
46     my $file  = shift;
47
48     open( my $fh, '<', $file ) or die $!;
49     binmode $fh;
50     my $content = do { local $/; <$fh> };
51     close $fh;
52
53     if ( eval { require Cpanel::JSON::XS } ) {
54         my $decoder = Cpanel::JSON::XS->new->utf8->relaxed;
55         return $decoder->decode( $content );
56     }
57     elsif ( eval { require JSON::MaybeXS } ) {
58         my $decoder = JSON::MaybeXS::JSON()->new->utf8->relaxed;
59         return $decoder->decode( $content );
60     }
61     elsif ( eval { require JSON::DWIW } ) {
62         my $decoder = JSON::DWIW->new;
63         my ( $data, $error ) = $decoder->from_json( $content );
64         die $error if $error;
65         return $data;
66     }
67     elsif ( eval { require JSON::XS } ) {
68         my $decoder = JSON::XS->new->utf8->relaxed;
69         return $decoder->decode( $content );
70     }
71     elsif ( eval { require JSON::Syck } ) {
72         require Encode;
73         return JSON::Syck::Load( Encode::decode('UTF-8', $content ) );
74     }
75     elsif ( eval { require JSON::PP; JSON::PP->VERSION( 2 ); } ) {
76         my $decoder = JSON::PP->new->utf8->relaxed;
77         return $decoder->decode( $content );
78     }
79     require JSON;
80     if ( eval { JSON->VERSION( 2 ) } ) {
81         return JSON::decode_json( $content );
82     }
83     else {
84         return JSON::jsonToObj( $content );
85     }
86 }
87
88 =head2 requires_any_of( )
89
90 Specifies that this modules requires one of, L<Cpanel::JSON::XS>,
91 L<JSON::MaybeXS>, L<JSON::DWIW>, L<JSON::XS>, L<JSON::Syck>, L<JSON::PP> or
92 L<JSON> in order to work.
93
94 =cut
95
96 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 <bricas@cpan.org>
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<Catalyst>
122
123 =item * L<Config::Any>
124
125 =item * L<Cpanel::JSON::XS>
126
127 =item * L<JSON::MaybeXS>
128
129 =item * L<JSON::DWIW>
130
131 =item * L<JSON::XS>
132
133 =item * L<JSON::Syck>
134
135 =item * L<JSON>
136
137 =back
138
139 =cut
140
141 1;