[Catalyst-commits] r12868 - in tags/Config-Any: . 0.19
0.19/lib/Config 0.19/lib/Config/Any
bricas at dev.catalyst.perl.org
bricas at dev.catalyst.perl.org
Mon Feb 15 14:03:58 GMT 2010
Author: bricas
Date: 2010-02-15 14:03:57 +0000 (Mon, 15 Feb 2010)
New Revision: 12868
Added:
tags/Config-Any/0.19/
tags/Config-Any/0.19/Changes
tags/Config-Any/0.19/lib/Config/Any.pm
tags/Config-Any/0.19/lib/Config/Any/General.pm
tags/Config-Any/0.19/lib/Config/Any/INI.pm
tags/Config-Any/0.19/lib/Config/Any/JSON.pm
tags/Config-Any/0.19/lib/Config/Any/Perl.pm
tags/Config-Any/0.19/lib/Config/Any/XML.pm
tags/Config-Any/0.19/lib/Config/Any/YAML.pm
Removed:
tags/Config-Any/0.19/Changes
tags/Config-Any/0.19/lib/Config/Any.pm
tags/Config-Any/0.19/lib/Config/Any/General.pm
tags/Config-Any/0.19/lib/Config/Any/INI.pm
tags/Config-Any/0.19/lib/Config/Any/JSON.pm
tags/Config-Any/0.19/lib/Config/Any/Perl.pm
tags/Config-Any/0.19/lib/Config/Any/XML.pm
tags/Config-Any/0.19/lib/Config/Any/YAML.pm
Log:
release 0.19
Copied: tags/Config-Any/0.19 (from rev 12866, trunk/Config-Any)
Deleted: tags/Config-Any/0.19/Changes
===================================================================
--- trunk/Config-Any/Changes 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/Changes 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,90 +0,0 @@
-Revision history for Config-Any
-
-0.18 Mon 16 Nov 2009
- - ensure XML loader's _coerce() method checks specifically for HASH refs
- - add YAML::XS to the top of the YAML loaders list
-
-0.17 Thu 05 Feb 2009
- - ensure require() happens against plugin specified in force_plugins.
- - add JSON::XS to the top of the JSON loaders list
-
-0.16 Mon 17 Nov 2008
- - fix up branches test which did not handle the errors thrown by
- changes from the last release (RT #40948)
- - fix up error message for "any of" (RT #40972)
-
-0.15 Wed 12 Nov 2008
- - when use_ext is true, we will check to see if there are no supported
- modules for a particular file. instead of the file being skipped, an
- error will be thrown (RT #38927).
- - also, when use_ext is true, a fatal error will be thrown if there are
- no loaders available that understand the file extension.
- - officially support multiple loaders per extension
- - add a Config::Any::Base for all loaders to inherit from, plus add
- a new dependency mechanism: requires_any_of() and requires_all_of().
- - filter out loaders that don't inherit from Config::Any::Base (RT #40830)
-
-0.14 Wed 06 Aug 2008
- - skip xml failure tests if XML::LibXML < 1.59 is installed, it seems
- to parse anything you throw at it (Matt S. Trout)
-
-0.13 Tue 05 Aug 2008
- - show actual parse error when parse fails (Marcus Ramberg)
- - ensure Config::Tiny parse errors are trapped
- - added tests for each format to ensure they throw parse errors
- - added a caveat regarding XML::Simple's strict mode (Peter Corlett)
- - added a flatten_to_hash option to return a simple key-value hashref
- instead of the default "arrayref of hashrefs" (Pedro Figueiredo)
-
-0.12 Mon 07 Apr 2008
- - ensure Perl loader dies on a failed require() (RT #32995)
-
-0.11 Mon 28 Jan 2008
- - fix subsection parsing for existing keys in INI files (RT #32726)
- - use from_json() if JSON version 2.x is available
- - refactor the test suite slightly
-
-0.10 Tue 11 Dec 2007
- - promote dev release to stable
-
-0.09_02 Tue Nov 13 2007
- - require version 0.70 of YAML::Syck for multi-document loading
-
-0.09_01 Tue Nov 13 2007
- - code and pod cleanups
- - use_ext is now on by default
- - when use_ext is on, if a loader throws an error, we throw an error
- - fix case where use_ext is defined and false, but was behaving like
- use_ext => 1
- - allow loaders to return multiple documents as an array
- - each plugin now has an is_supported() method which helps us figure out
- if the right modules are available
-
-0.08 Thu Aug 23 2007
- - pass config options to each parser
- - fix for loading the same perl config twice (RT #28812)
-
-0.07 Mon Feb 26 2007
- - promote 0.06_01 to non-dev.
-
-0.06_01 Sun Feb 25 19:23:00 2007
- - fixed bug [rt.cpan.org #25143] make tests fails
- + t/61_features.t had 1 more test added than was set to skip if the INI
- parser was not installed. Fixed by s/9/10/ on the skip() line.
-
-0.06 Thu Feb 22 21:05:00 2007
- - removed reference to Test::Exception, bumped version number
-
-0.05 Wed Feb 21 22:00:00 2007
- - added support for (requested by Evan Kaufman):
- + 'force_plugins => [ qw(Config::Any::Foo Config::Any::Blah) ]' parameter
- to load_(files|stems)
- + $Config::Any::INI::MAP_SECTION_SPACE_TO_NESTED_KEY - boolean, defaulting
- to on, controlling whether to map spaces in INI section headings
- to nested hashrefs
-
-0.04 Mon Aug 7 15:15:15 2006
- - Initial CPAN-worthy release with proper test suite
-
-0.01 - 0.03 dev releases
-
Copied: tags/Config-Any/0.19/Changes (from rev 12867, trunk/Config-Any/Changes)
===================================================================
--- tags/Config-Any/0.19/Changes (rev 0)
+++ tags/Config-Any/0.19/Changes 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,95 @@
+Revision history for Config-Any
+
+0.19 Mon 15 Feb 2010
+ - add JSON::DWIW to the top of the JSON loaders list (caelum)
+ - remove need for caching in Perl loader by using do() instead
+ of require() (caelum)
+
+0.18 Mon 16 Nov 2009
+ - ensure XML loader's _coerce() method checks specifically for HASH refs
+ - add YAML::XS to the top of the YAML loaders list
+
+0.17 Thu 05 Feb 2009
+ - ensure require() happens against plugin specified in force_plugins.
+ - add JSON::XS to the top of the JSON loaders list
+
+0.16 Mon 17 Nov 2008
+ - fix up branches test which did not handle the errors thrown by
+ changes from the last release (RT #40948)
+ - fix up error message for "any of" (RT #40972)
+
+0.15 Wed 12 Nov 2008
+ - when use_ext is true, we will check to see if there are no supported
+ modules for a particular file. instead of the file being skipped, an
+ error will be thrown (RT #38927).
+ - also, when use_ext is true, a fatal error will be thrown if there are
+ no loaders available that understand the file extension.
+ - officially support multiple loaders per extension
+ - add a Config::Any::Base for all loaders to inherit from, plus add
+ a new dependency mechanism: requires_any_of() and requires_all_of().
+ - filter out loaders that don't inherit from Config::Any::Base (RT #40830)
+
+0.14 Wed 06 Aug 2008
+ - skip xml failure tests if XML::LibXML < 1.59 is installed, it seems
+ to parse anything you throw at it (Matt S. Trout)
+
+0.13 Tue 05 Aug 2008
+ - show actual parse error when parse fails (Marcus Ramberg)
+ - ensure Config::Tiny parse errors are trapped
+ - added tests for each format to ensure they throw parse errors
+ - added a caveat regarding XML::Simple's strict mode (Peter Corlett)
+ - added a flatten_to_hash option to return a simple key-value hashref
+ instead of the default "arrayref of hashrefs" (Pedro Figueiredo)
+
+0.12 Mon 07 Apr 2008
+ - ensure Perl loader dies on a failed require() (RT #32995)
+
+0.11 Mon 28 Jan 2008
+ - fix subsection parsing for existing keys in INI files (RT #32726)
+ - use from_json() if JSON version 2.x is available
+ - refactor the test suite slightly
+
+0.10 Tue 11 Dec 2007
+ - promote dev release to stable
+
+0.09_02 Tue Nov 13 2007
+ - require version 0.70 of YAML::Syck for multi-document loading
+
+0.09_01 Tue Nov 13 2007
+ - code and pod cleanups
+ - use_ext is now on by default
+ - when use_ext is on, if a loader throws an error, we throw an error
+ - fix case where use_ext is defined and false, but was behaving like
+ use_ext => 1
+ - allow loaders to return multiple documents as an array
+ - each plugin now has an is_supported() method which helps us figure out
+ if the right modules are available
+
+0.08 Thu Aug 23 2007
+ - pass config options to each parser
+ - fix for loading the same perl config twice (RT #28812)
+
+0.07 Mon Feb 26 2007
+ - promote 0.06_01 to non-dev.
+
+0.06_01 Sun Feb 25 19:23:00 2007
+ - fixed bug [rt.cpan.org #25143] make tests fails
+ + t/61_features.t had 1 more test added than was set to skip if the INI
+ parser was not installed. Fixed by s/9/10/ on the skip() line.
+
+0.06 Thu Feb 22 21:05:00 2007
+ - removed reference to Test::Exception, bumped version number
+
+0.05 Wed Feb 21 22:00:00 2007
+ - added support for (requested by Evan Kaufman):
+ + 'force_plugins => [ qw(Config::Any::Foo Config::Any::Blah) ]' parameter
+ to load_(files|stems)
+ + $Config::Any::INI::MAP_SECTION_SPACE_TO_NESTED_KEY - boolean, defaulting
+ to on, controlling whether to map spaces in INI section headings
+ to nested hashrefs
+
+0.04 Mon Aug 7 15:15:15 2006
+ - Initial CPAN-worthy release with proper test suite
+
+0.01 - 0.03 dev releases
+
Deleted: tags/Config-Any/0.19/lib/Config/Any/General.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any/General.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any/General.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,113 +0,0 @@
-package Config::Any::General;
-
-use strict;
-use warnings;
-
-use base 'Config::Any::Base';
-
-=head1 NAME
-
-Config::Any::General - Load Config::General files
-
-=head1 DESCRIPTION
-
-Loads Config::General files. Example:
-
- name = TestApp
- <Component Controller::Foo>
- foo bar
- </Component>
- <Model Baz>
- qux xyzzy
- </Model>
-
-=head1 METHODS
-
-=head2 extensions( )
-
-return an array of valid extensions (C<cnf>, C<conf>).
-
-=cut
-
-sub extensions {
- return qw( cnf conf );
-}
-
-=head2 load( $file )
-
-Attempts to load C<$file> via Config::General.
-
-=cut
-
-sub load {
- my $class = shift;
- my $file = shift;
- my $args = shift || {};
-
- # work around bug (?) in Config::General
- # return if $class->_test_perl($file);
-
- $args->{ -ConfigFile } = $file;
-
- require Config::General;
- my $configfile = Config::General->new( %$args );
- my $config = { $configfile->getall };
-
- return $config;
-}
-
-# this is a bit of a hack but necessary, because Config::General is *far* too lax
-# about what it will load -- specifically, it seems to be quite happy to load a Perl
-# config file (ie, a file which is valid Perl and creates a hashref) as if it were
-# an Apache-style configuration file, presumably due to laziness on the part of the
-# developer.
-
-sub _test_perl {
- my ( $class, $file ) = @_;
- my $is_perl_src;
- eval { $is_perl_src = do "$file"; };
- delete $INC{ $file }; # so we don't screw stuff later on
- return defined $is_perl_src;
-}
-
-=head2 requires_all_of( )
-
-Specifies that this module requires L<Config::General> in order to work.
-
-=cut
-
-sub requires_all_of { 'Config::General' }
-
-=head1 AUTHOR
-
-Brian Cassidy E<lt>bricas at cpan.orgE<gt>
-
-=head1 CONTRIBUTORS
-
-Joel Bernstein C<< <rataxis at cpan.org> >>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2009 by Brian Cassidy
-
-Portions Copyright 2006 Portugal Telecom
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Catalyst>
-
-=item * L<Config::Any>
-
-=item * L<Config::General>
-
-=back
-
-=cut
-
-1;
-
Copied: tags/Config-Any/0.19/lib/Config/Any/General.pm (from rev 12867, trunk/Config-Any/lib/Config/Any/General.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any/General.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any/General.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,113 @@
+package Config::Any::General;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+=head1 NAME
+
+Config::Any::General - Load Config::General files
+
+=head1 DESCRIPTION
+
+Loads Config::General files. Example:
+
+ name = TestApp
+ <Component Controller::Foo>
+ foo bar
+ </Component>
+ <Model Baz>
+ qux xyzzy
+ </Model>
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<cnf>, C<conf>).
+
+=cut
+
+sub extensions {
+ return qw( cnf conf );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> via Config::General.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+ my $args = shift || {};
+
+ # work around bug (?) in Config::General
+ # return if $class->_test_perl($file);
+
+ $args->{ -ConfigFile } = $file;
+
+ require Config::General;
+ my $configfile = Config::General->new( %$args );
+ my $config = { $configfile->getall };
+
+ return $config;
+}
+
+# this is a bit of a hack but necessary, because Config::General is *far* too lax
+# about what it will load -- specifically, it seems to be quite happy to load a Perl
+# config file (ie, a file which is valid Perl and creates a hashref) as if it were
+# an Apache-style configuration file, presumably due to laziness on the part of the
+# developer.
+
+sub _test_perl {
+ my ( $class, $file ) = @_;
+ my $is_perl_src;
+ eval { $is_perl_src = do "$file"; };
+ delete $INC{ $file }; # so we don't screw stuff later on
+ return defined $is_perl_src;
+}
+
+=head2 requires_all_of( )
+
+Specifies that this module requires L<Config::General> in order to work.
+
+=cut
+
+sub requires_all_of { 'Config::General' }
+
+=head1 AUTHOR
+
+Brian Cassidy E<lt>bricas at cpan.orgE<gt>
+
+=head1 CONTRIBUTORS
+
+Joel Bernstein C<< <rataxis at cpan.org> >>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2010 by Brian Cassidy
+
+Portions Copyright 2006 Portugal Telecom
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Catalyst>
+
+=item * L<Config::Any>
+
+=item * L<Config::General>
+
+=back
+
+=cut
+
+1;
+
Deleted: tags/Config-Any/0.19/lib/Config/Any/INI.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any/INI.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any/INI.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,125 +0,0 @@
-package Config::Any::INI;
-
-use strict;
-use warnings;
-
-use base 'Config::Any::Base';
-
-our $MAP_SECTION_SPACE_TO_NESTED_KEY = 1;
-
-=head1 NAME
-
-Config::Any::INI - Load INI config files
-
-=head1 DESCRIPTION
-
-Loads INI files. Example:
-
- name=TestApp
-
- [Controller::Foo]
- foo=bar
-
- [Model::Baz]
- qux=xyzzy
-
-=head1 METHODS
-
-=head2 extensions( )
-
-return an array of valid extensions (C<ini>).
-
-=cut
-
-sub extensions {
- return qw( ini );
-}
-
-=head2 load( $file )
-
-Attempts to load C<$file> as an INI file.
-
-=cut
-
-sub load {
- my $class = shift;
- my $file = shift;
-
- require Config::Tiny;
- my $config = Config::Tiny->read( $file );
-
- die $Config::Tiny::errstr if not defined $config;
-
- my $out = delete $config->{ _ } || {};
-
- for my $k ( keys %$config ) {
- my @keys = split /\s+/, $k;
- my $ref = $config->{ $k };
-
- if ( $MAP_SECTION_SPACE_TO_NESTED_KEY && @keys > 1 ) {
- my ( $a, $b ) = @keys[ 0, 1 ];
- $out->{ $a }->{ $b } = $ref;
- }
- else {
- $out->{ $k } = { %{ $out->{ $k } || {} }, %$ref };
- }
- }
-
- return $out;
-}
-
-=head2 requires_all_of( )
-
-Specifies that this module requires L<Config::Tiny> in order to work.
-
-=cut
-
-sub requires_all_of { 'Config::Tiny' }
-
-=head1 PACKAGE VARIABLES
-
-=over 4
-
-=item $MAP_SECTION_SPACE_TO_NESTED_KEY (boolean)
-
-This variable controls whether spaces in INI section headings will be expanded into nested hash keys.
-e.g. it controls whether [Full Power] maps to $config->{'Full Power'} or $config->{'Full'}->{'Power'}
-
-By default it is set to 1 (i.e. true).
-
-Set it to 0 to preserve literal spaces in section headings:
-
- use Config::Any;
- use Config::Any::INI;
- $Config::Any::INI::MAP_SECTION_SPACE_TO_NESTED_KEY = 0;
-
-=back
-
-=head1 AUTHORS
-
-Brian Cassidy E<lt>bricas at cpan.orgE<gt>
-
-Joel Bernstein E<lt>rataxis at cpan.orgE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2009 by Brian Cassidy, portions copyright 2006, 2007 by Joel Bernstein
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Catalyst>
-
-=item * L<Config::Any>
-
-=item * L<Config::Tiny>
-
-=back
-
-=cut
-
-1;
Copied: tags/Config-Any/0.19/lib/Config/Any/INI.pm (from rev 12867, trunk/Config-Any/lib/Config/Any/INI.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any/INI.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any/INI.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,125 @@
+package Config::Any::INI;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+our $MAP_SECTION_SPACE_TO_NESTED_KEY = 1;
+
+=head1 NAME
+
+Config::Any::INI - Load INI config files
+
+=head1 DESCRIPTION
+
+Loads INI files. Example:
+
+ name=TestApp
+
+ [Controller::Foo]
+ foo=bar
+
+ [Model::Baz]
+ qux=xyzzy
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<ini>).
+
+=cut
+
+sub extensions {
+ return qw( ini );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> as an INI file.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+
+ require Config::Tiny;
+ my $config = Config::Tiny->read( $file );
+
+ die $Config::Tiny::errstr if not defined $config;
+
+ my $out = delete $config->{ _ } || {};
+
+ for my $k ( keys %$config ) {
+ my @keys = split /\s+/, $k;
+ my $ref = $config->{ $k };
+
+ if ( $MAP_SECTION_SPACE_TO_NESTED_KEY && @keys > 1 ) {
+ my ( $a, $b ) = @keys[ 0, 1 ];
+ $out->{ $a }->{ $b } = $ref;
+ }
+ else {
+ $out->{ $k } = { %{ $out->{ $k } || {} }, %$ref };
+ }
+ }
+
+ return $out;
+}
+
+=head2 requires_all_of( )
+
+Specifies that this module requires L<Config::Tiny> in order to work.
+
+=cut
+
+sub requires_all_of { 'Config::Tiny' }
+
+=head1 PACKAGE VARIABLES
+
+=over 4
+
+=item $MAP_SECTION_SPACE_TO_NESTED_KEY (boolean)
+
+This variable controls whether spaces in INI section headings will be expanded into nested hash keys.
+e.g. it controls whether [Full Power] maps to $config->{'Full Power'} or $config->{'Full'}->{'Power'}
+
+By default it is set to 1 (i.e. true).
+
+Set it to 0 to preserve literal spaces in section headings:
+
+ use Config::Any;
+ use Config::Any::INI;
+ $Config::Any::INI::MAP_SECTION_SPACE_TO_NESTED_KEY = 0;
+
+=back
+
+=head1 AUTHORS
+
+Brian Cassidy E<lt>bricas at cpan.orgE<gt>
+
+Joel Bernstein E<lt>rataxis at cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2010 by Brian Cassidy, portions copyright 2006, 2007 by Joel Bernstein
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Catalyst>
+
+=item * L<Config::Any>
+
+=item * L<Config::Tiny>
+
+=back
+
+=cut
+
+1;
Deleted: tags/Config-Any/0.19/lib/Config/Any/JSON.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any/JSON.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any/JSON.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,116 +0,0 @@
-package Config::Any::JSON;
-
-use strict;
-use warnings;
-
-use base 'Config::Any::Base';
-
-=head1 NAME
-
-Config::Any::JSON - Load JSON config files
-
-=head1 DESCRIPTION
-
-Loads JSON files. Example:
-
- {
- "name": "TestApp",
- "Controller::Foo": {
- "foo": "bar"
- },
- "Model::Baz": {
- "qux": "xyzzy"
- }
- }
-
-=head1 METHODS
-
-=head2 extensions( )
-
-return an array of valid extensions (C<json>, C<jsn>).
-
-=cut
-
-sub extensions {
- return qw( json jsn );
-}
-
-=head2 load( $file )
-
-Attempts to load C<$file> as a JSON file.
-
-=cut
-
-sub load {
- my $class = shift;
- my $file = shift;
-
- open( my $fh, $file ) or die $!;
- my $content = do { local $/; <$fh> };
- close $fh;
-
- eval { require JSON::DWIW; };
- unless( $@ ) {
- my $decoder = JSON::DWIW->new;
- my ( $data, $error ) = $decoder->from_json( $content );
- die $error if $error;
- return $data;
- }
-
- eval { require JSON::XS; };
- unless( $@ ) {
- my $decoder = JSON::XS->new->relaxed;
- return $decoder->decode( $content );
- }
-
- eval { require JSON::Syck; };
- unless( $@ ) {
- return JSON::Syck::Load( $content );
- }
-
- require JSON;
- eval { JSON->VERSION( 2 ); };
- return $@ ? JSON::jsonToObj( $content ) : JSON::from_json( $content );
-}
-
-=head2 requires_any_of( )
-
-Specifies that this modules requires one of, L<JSON::DWIW>, L<JSON::XS>,
-L<JSON::Syck> or L<JSON> in order to work.
-
-=cut
-
-sub requires_any_of { 'JSON::DWIW', 'JSON::XS', 'JSON::Syck', 'JSON' }
-
-=head1 AUTHOR
-
-Brian Cassidy E<lt>bricas at cpan.orgE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2009 by Brian Cassidy
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Catalyst>
-
-=item * L<Config::Any>
-
-=item * L<JSON::DWIW>
-
-=item * L<JSON::XS>
-
-=item * L<JSON::Syck>
-
-=item * L<JSON>
-
-=back
-
-=cut
-
-1;
Copied: tags/Config-Any/0.19/lib/Config/Any/JSON.pm (from rev 12867, trunk/Config-Any/lib/Config/Any/JSON.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any/JSON.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any/JSON.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,116 @@
+package Config::Any::JSON;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+=head1 NAME
+
+Config::Any::JSON - Load JSON config files
+
+=head1 DESCRIPTION
+
+Loads JSON files. Example:
+
+ {
+ "name": "TestApp",
+ "Controller::Foo": {
+ "foo": "bar"
+ },
+ "Model::Baz": {
+ "qux": "xyzzy"
+ }
+ }
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<json>, C<jsn>).
+
+=cut
+
+sub extensions {
+ return qw( json jsn );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> as a JSON file.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+
+ open( my $fh, $file ) or die $!;
+ my $content = do { local $/; <$fh> };
+ close $fh;
+
+ eval { require JSON::DWIW; };
+ unless( $@ ) {
+ my $decoder = JSON::DWIW->new;
+ my ( $data, $error ) = $decoder->from_json( $content );
+ die $error if $error;
+ return $data;
+ }
+
+ eval { require JSON::XS; };
+ unless( $@ ) {
+ my $decoder = JSON::XS->new->relaxed;
+ return $decoder->decode( $content );
+ }
+
+ eval { require JSON::Syck; };
+ unless( $@ ) {
+ return JSON::Syck::Load( $content );
+ }
+
+ require JSON;
+ eval { JSON->VERSION( 2 ); };
+ return $@ ? JSON::jsonToObj( $content ) : JSON::from_json( $content );
+}
+
+=head2 requires_any_of( )
+
+Specifies that this modules requires one of, L<JSON::DWIW>, L<JSON::XS>,
+L<JSON::Syck> or L<JSON> in order to work.
+
+=cut
+
+sub requires_any_of { 'JSON::DWIW', 'JSON::XS', 'JSON::Syck', 'JSON' }
+
+=head1 AUTHOR
+
+Brian Cassidy E<lt>bricas at cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2010 by Brian Cassidy
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Catalyst>
+
+=item * L<Config::Any>
+
+=item * L<JSON::DWIW>
+
+=item * L<JSON::XS>
+
+=item * L<JSON::Syck>
+
+=item * L<JSON>
+
+=back
+
+=cut
+
+1;
Deleted: tags/Config-Any/0.19/lib/Config/Any/Perl.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any/Perl.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any/Perl.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,82 +0,0 @@
-package Config::Any::Perl;
-
-use strict;
-use warnings;
-
-use base 'Config::Any::Base';
-
-=head1 NAME
-
-Config::Any::Perl - Load Perl config files
-
-=head1 DESCRIPTION
-
-Loads Perl files. Example:
-
- {
- name => 'TestApp',
- 'Controller::Foo' => {
- foo => 'bar'
- },
- 'Model::Baz' => {
- qux => 'xyzzy'
- }
- }
-
-=head1 METHODS
-
-=head2 extensions( )
-
-return an array of valid extensions (C<pl>, C<perl>).
-
-=cut
-
-sub extensions {
- return qw( pl perl );
-}
-
-=head2 load( $file )
-
-Attempts to load C<$file> as a Perl file.
-
-=cut
-
-sub load {
- my $class = shift;
- my $file = shift;
- my $content;
- my $exception;
- {
- local $@;
- $content = do $file;
- $exception = $@;
- }
- die $exception if $exception;
-
- return $content;
-}
-
-=head1 AUTHOR
-
-Brian Cassidy E<lt>bricas at cpan.orgE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2009 by Brian Cassidy
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Catalyst>
-
-=item * L<Config::Any>
-
-=back
-
-=cut
-
-1;
Copied: tags/Config-Any/0.19/lib/Config/Any/Perl.pm (from rev 12867, trunk/Config-Any/lib/Config/Any/Perl.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any/Perl.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any/Perl.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,82 @@
+package Config::Any::Perl;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+=head1 NAME
+
+Config::Any::Perl - Load Perl config files
+
+=head1 DESCRIPTION
+
+Loads Perl files. Example:
+
+ {
+ name => 'TestApp',
+ 'Controller::Foo' => {
+ foo => 'bar'
+ },
+ 'Model::Baz' => {
+ qux => 'xyzzy'
+ }
+ }
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<pl>, C<perl>).
+
+=cut
+
+sub extensions {
+ return qw( pl perl );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> as a Perl file.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+
+ my( $exception, $content );
+ {
+ local $@;
+ $content = do $file;
+ $exception = $@;
+ }
+ die $exception if $exception;
+
+ return $content;
+}
+
+=head1 AUTHOR
+
+Brian Cassidy E<lt>bricas at cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2010 by Brian Cassidy
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Catalyst>
+
+=item * L<Config::Any>
+
+=back
+
+=cut
+
+1;
Deleted: tags/Config-Any/0.19/lib/Config/Any/XML.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any/XML.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any/XML.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,123 +0,0 @@
-package Config::Any::XML;
-
-use strict;
-use warnings;
-
-use base 'Config::Any::Base';
-
-=head1 NAME
-
-Config::Any::XML - Load XML config files
-
-=head1 DESCRIPTION
-
-Loads XML files. Example:
-
- <config>
- <name>TestApp</name>
- <component name="Controller::Foo">
- <foo>bar</foo>
- </component>
- <model name="Baz">
- <qux>xyzzy</qux>
- </model>
- </config>
-
-=head1 METHODS
-
-=head2 extensions( )
-
-return an array of valid extensions (C<xml>).
-
-=cut
-
-sub extensions {
- return qw( xml );
-}
-
-=head2 load( $file )
-
-Attempts to load C<$file> as an XML file.
-
-=cut
-
-sub load {
- my $class = shift;
- my $file = shift;
- my $args = shift || {};
-
- require XML::Simple;
- my $config = XML::Simple::XMLin(
- $file,
- ForceArray => [ qw( component model view controller ) ],
- %$args
- );
-
- return $class->_coerce( $config );
-}
-
-sub _coerce {
- # coerce the XML-parsed config into the correct format
- my $class = shift;
- my $config = shift;
- my $out;
- for my $k ( keys %$config ) {
- my $ref = $config->{ $k };
- my $name = ref $ref eq 'HASH' ? delete $ref->{ name } : undef;
- if ( defined $name ) {
- $out->{ $k }->{ $name } = $ref;
- }
- else {
- $out->{ $k } = $ref;
- }
- }
- $out;
-}
-
-=head2 requires_all_of( )
-
-Specifies that this module requires L<XML::Simple> in order to work.
-
-=cut
-
-sub requires_all_of { 'XML::Simple' }
-
-=head1 CAVEATS
-
-=head2 Strict Mode
-
-If, by some chance, L<XML::Simple> has already been loaded with the strict
-flag turned on, then you will likely get errors as warnings will become
-fatal exceptions and certain arguments to XMLin() will no longer be optional.
-
-See L<XML::Simple's strict mode documentation|XML::Simple/STRICT_MODE> for
-more information.
-
-=head1 AUTHORS
-
-Brian Cassidy E<lt>bricas at cpan.orgE<gt>
-
-Joel Bernstein E<lt>rataxis at cpan.orgE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2009 by Brian Cassidy
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Catalyst>
-
-=item * L<Config::Any>
-
-=item * L<XML::Simple>
-
-=back
-
-=cut
-
-1;
Copied: tags/Config-Any/0.19/lib/Config/Any/XML.pm (from rev 12867, trunk/Config-Any/lib/Config/Any/XML.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any/XML.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any/XML.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,123 @@
+package Config::Any::XML;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+=head1 NAME
+
+Config::Any::XML - Load XML config files
+
+=head1 DESCRIPTION
+
+Loads XML files. Example:
+
+ <config>
+ <name>TestApp</name>
+ <component name="Controller::Foo">
+ <foo>bar</foo>
+ </component>
+ <model name="Baz">
+ <qux>xyzzy</qux>
+ </model>
+ </config>
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<xml>).
+
+=cut
+
+sub extensions {
+ return qw( xml );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> as an XML file.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+ my $args = shift || {};
+
+ require XML::Simple;
+ my $config = XML::Simple::XMLin(
+ $file,
+ ForceArray => [ qw( component model view controller ) ],
+ %$args
+ );
+
+ return $class->_coerce( $config );
+}
+
+sub _coerce {
+ # coerce the XML-parsed config into the correct format
+ my $class = shift;
+ my $config = shift;
+ my $out;
+ for my $k ( keys %$config ) {
+ my $ref = $config->{ $k };
+ my $name = ref $ref eq 'HASH' ? delete $ref->{ name } : undef;
+ if ( defined $name ) {
+ $out->{ $k }->{ $name } = $ref;
+ }
+ else {
+ $out->{ $k } = $ref;
+ }
+ }
+ $out;
+}
+
+=head2 requires_all_of( )
+
+Specifies that this module requires L<XML::Simple> in order to work.
+
+=cut
+
+sub requires_all_of { 'XML::Simple' }
+
+=head1 CAVEATS
+
+=head2 Strict Mode
+
+If, by some chance, L<XML::Simple> has already been loaded with the strict
+flag turned on, then you will likely get errors as warnings will become
+fatal exceptions and certain arguments to XMLin() will no longer be optional.
+
+See L<XML::Simple's strict mode documentation|XML::Simple/STRICT_MODE> for
+more information.
+
+=head1 AUTHORS
+
+Brian Cassidy E<lt>bricas at cpan.orgE<gt>
+
+Joel Bernstein E<lt>rataxis at cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2010 by Brian Cassidy
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Catalyst>
+
+=item * L<Config::Any>
+
+=item * L<XML::Simple>
+
+=back
+
+=cut
+
+1;
Deleted: tags/Config-Any/0.19/lib/Config/Any/YAML.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any/YAML.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any/YAML.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,107 +0,0 @@
-package Config::Any::YAML;
-
-use strict;
-use warnings;
-
-use base 'Config::Any::Base';
-
-use Carp ();
-
-=head1 NAME
-
-Config::Any::YAML - Load YAML config files
-
-=head1 DESCRIPTION
-
-Loads YAML files. Example:
-
- ---
- name: TestApp
- Controller::Foo:
- foo: bar
- Model::Baz:
- qux: xyzzy
-
-
-=head1 METHODS
-
-=head2 extensions( )
-
-return an array of valid extensions (C<yml>, C<yaml>).
-
-=cut
-
-sub extensions {
- return qw( yml yaml );
-}
-
-=head2 load( $file )
-
-Attempts to load C<$file> as a YAML file.
-
-=cut
-
-sub load {
- my $class = shift;
- my $file = shift;
-
- eval { require YAML::XS };
- unless ( $@ ) {
- return YAML::XS::LoadFile( $file );
- }
-
- Carp::carp
- 'Use of YAML::Syck or YAML to parse config files is DEPRECATED. '
- . 'Please install YAML::XS for proper YAML support';
-
- eval { require YAML::Syck; YAML::Syck->VERSION( '0.70' ) };
- unless ( $@ ) {
- open( my $fh, $file ) or die $!;
- my $content = do { local $/; <$fh> };
- close $fh;
- return YAML::Syck::Load( $content );
- }
-
- require YAML;
- return YAML::LoadFile( $file );
-}
-
-=head2 requires_any_of( )
-
-Specifies that this modules requires one of L<YAML::XS>, L<YAML::Syck> (0.70) or
-L<YAML> in order to work.
-
-=cut
-
-sub requires_any_of { 'YAML::XS', [ 'YAML::Syck', '0.70' ], 'YAML' }
-
-=head1 AUTHOR
-
-Brian Cassidy E<lt>bricas at cpan.orgE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright 2006-2009 by Brian Cassidy
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item * L<Catalyst>
-
-=item * L<Config::Any>
-
-=item * L<YAML::XS>
-
-=item * L<YAML>
-
-=item * L<YAML::Syck>
-
-=back
-
-=cut
-
-1;
Copied: tags/Config-Any/0.19/lib/Config/Any/YAML.pm (from rev 12867, trunk/Config-Any/lib/Config/Any/YAML.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any/YAML.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any/YAML.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,107 @@
+package Config::Any::YAML;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+use Carp ();
+
+=head1 NAME
+
+Config::Any::YAML - Load YAML config files
+
+=head1 DESCRIPTION
+
+Loads YAML files. Example:
+
+ ---
+ name: TestApp
+ Controller::Foo:
+ foo: bar
+ Model::Baz:
+ qux: xyzzy
+
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<yml>, C<yaml>).
+
+=cut
+
+sub extensions {
+ return qw( yml yaml );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> as a YAML file.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+
+ eval { require YAML::XS };
+ unless ( $@ ) {
+ return YAML::XS::LoadFile( $file );
+ }
+
+ Carp::carp
+ 'Use of YAML::Syck or YAML to parse config files is DEPRECATED. '
+ . 'Please install YAML::XS for proper YAML support';
+
+ eval { require YAML::Syck; YAML::Syck->VERSION( '0.70' ) };
+ unless ( $@ ) {
+ open( my $fh, $file ) or die $!;
+ my $content = do { local $/; <$fh> };
+ close $fh;
+ return YAML::Syck::Load( $content );
+ }
+
+ require YAML;
+ return YAML::LoadFile( $file );
+}
+
+=head2 requires_any_of( )
+
+Specifies that this modules requires one of L<YAML::XS>, L<YAML::Syck> (0.70) or
+L<YAML> in order to work.
+
+=cut
+
+sub requires_any_of { 'YAML::XS', [ 'YAML::Syck', '0.70' ], 'YAML' }
+
+=head1 AUTHOR
+
+Brian Cassidy E<lt>bricas at cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2006-2010 by Brian Cassidy
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * L<Catalyst>
+
+=item * L<Config::Any>
+
+=item * L<YAML::XS>
+
+=item * L<YAML>
+
+=item * L<YAML::Syck>
+
+=back
+
+=cut
+
+1;
Deleted: tags/Config-Any/0.19/lib/Config/Any.pm
===================================================================
--- trunk/Config-Any/lib/Config/Any.pm 2010-02-15 13:52:28 UTC (rev 12866)
+++ tags/Config-Any/0.19/lib/Config/Any.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -1,388 +0,0 @@
-package Config::Any;
-
-use strict;
-use warnings;
-
-use Carp;
-use Module::Pluggable::Object ();
-
-our $VERSION = '0.18';
-
-=head1 NAME
-
-Config::Any - Load configuration from different file formats, transparently
-
-=head1 SYNOPSIS
-
- use Config::Any;
-
- my $cfg = Config::Any->load_stems({stems => \@filepath_stems, ... });
- # or
- my $cfg = Config::Any->load_files({files => \@filepaths, ... });
-
- for (@$cfg) {
- my ($filename, $config) = %$_;
- $class->config($config);
- warn "loaded config from file: $filename";
- }
-
-=head1 DESCRIPTION
-
-L<Config::Any|Config::Any> provides a facility for Perl applications and libraries
-to load configuration data from multiple different file formats. It supports XML, YAML,
-JSON, Apache-style configuration, Windows INI files, and even Perl code.
-
-The rationale for this module is as follows: Perl programs are deployed on many different
-platforms and integrated with many different systems. Systems administrators and end
-users may prefer different configuration formats than the developers. The flexibility
-inherent in a multiple format configuration loader allows different users to make
-different choices, without generating extra work for the developers. As a developer
-you only need to learn a single interface to be able to use the power of different
-configuration formats.
-
-=head1 INTERFACE
-
-=cut
-
-=head2 load_files( \%args )
-
- Config::Any->load_files( { files => \@files } );
- Config::Any->load_files( { files => \@files, filter => \&filter } );
- Config::Any->load_files( { files => \@files, use_ext => 1 } );
- Config::Any->load_files( { files => \@files, flatten_to_hash => 1 } );
-
-C<load_files()> attempts to load configuration from the list of files passed in
-the C<files> parameter, if the file exists.
-
-If the C<filter> parameter is set, it is used as a callback to modify the configuration
-data before it is returned. It will be passed a single hash-reference parameter which
-it should modify in-place.
-
-If the C<use_ext> parameter is defined, the loader will attempt to parse the file
-extension from each filename and will skip the file unless it matches a standard
-extension for the loading plugins. Only plugins whose standard extensions match the
-file extension will be used. For efficiency reasons, its use is encouraged, but
-be aware that you will lose flexibility -- for example, a file called C<myapp.cfg>
-containing YAML data will not be offered to the YAML plugin, whereas C<myapp.yml>
-or C<myapp.yaml> would be.
-
-When the C<flatten_to_hash> parameter is defined, the loader will return a hash
-keyed on the file names, as opposed to the usual list of single-key hashes.
-
-C<load_files()> also supports a 'force_plugins' parameter, whose value should be an
-arrayref of plugin names like C<Config::Any::INI>. Its intended use is to allow the use
-of a non-standard file extension while forcing it to be offered to a particular parser.
-It is not compatible with 'use_ext'.
-
-You can supply a C<driver_args> hashref to pass special options to a particular
-parser object. Example:
-
- Config::Any->load_files( { files => \@files, driver_args => {
- General => { -LowerCaseNames => 1 }
- } )
-
-=cut
-
-sub load_files {
- my ( $class, $args ) = @_;
-
- unless ( $args && exists $args->{ files } ) {
- warn "No files specified!";
- return;
- }
-
- return $class->_load( $args );
-}
-
-=head2 load_stems( \%args )
-
- Config::Any->load_stems( { stems => \@stems } );
- Config::Any->load_stems( { stems => \@stems, filter => \&filter } );
- Config::Any->load_stems( { stems => \@stems, use_ext => 1 } );
- Config::Any->load_stems( { stems => \@stems, flatten_to_hash => 1 } );
-
-C<load_stems()> attempts to load configuration from a list of files which it generates
-by combining the filename stems list passed in the C<stems> parameter with the
-potential filename extensions from each loader, which you can check with the
-C<extensions()> classmethod described below. Once this list of possible filenames is
-built it is treated exactly as in C<load_files()> above, as which it takes the same
-parameters. Please read the C<load_files()> documentation before using this method.
-
-=cut
-
-sub load_stems {
- my ( $class, $args ) = @_;
-
- unless ( $args && exists $args->{ stems } ) {
- warn "No stems specified!";
- return;
- }
-
- my $stems = delete $args->{ stems };
- my @files;
- for my $s ( @$stems ) {
- for my $ext ( $class->extensions ) {
- push @files, "$s.$ext";
- }
- }
-
- $args->{ files } = \@files;
- return $class->_load( $args );
-}
-
-sub _load {
- my ( $class, $args ) = @_;
- croak "_load requires a arrayref of file paths" unless $args->{ files };
-
- my $force = defined $args->{ force_plugins };
- if ( !$force and !defined $args->{ use_ext } ) {
- warn
- "use_ext argument was not explicitly set, as of 0.09, this is true by default";
- $args->{ use_ext } = 1;
- }
-
- # figure out what plugins we're using
- my @plugins = $force
- ? map { eval "require $_;"; $_; } @{ $args->{ force_plugins } }
- : $class->plugins;
-
- # map extensions if we have to
- my ( %extension_lut, $extension_re );
- my $use_ext_lut = !$force && $args->{ use_ext };
- if ( $use_ext_lut ) {
- for my $plugin ( @plugins ) {
- for ( $plugin->extensions ) {
- $extension_lut{ $_ } ||= [];
- push @{ $extension_lut{ $_ } }, $plugin;
- }
- }
-
- $extension_re = join( '|', keys %extension_lut );
- }
-
- # map args to plugins
- my $base_class = __PACKAGE__;
- my %loader_args;
- for my $plugin ( @plugins ) {
- $plugin =~ m{^$base_class\::(.+)};
- $loader_args{ $plugin } = $args->{ driver_args }->{ $1 } || {};
- }
-
- my @results;
-
- for my $filename ( @{ $args->{ files } } ) {
-
- # don't even bother if it's not there
- next unless -f $filename;
-
- my @try_plugins = @plugins;
-
- if ( $use_ext_lut ) {
- $filename =~ m{\.($extension_re)\z};
-
- if ( !$1 ) {
- $filename =~ m{\.([^.]+)\z};
- croak "There are no loaders available for .${1} files";
- }
-
- @try_plugins = @{ $extension_lut{ $1 } };
- }
-
- # not using use_ext means we try all plugins anyway, so we'll
- # ignore it for the "unsupported" error
- my $supported = $use_ext_lut ? 0 : 1;
- for my $loader ( @try_plugins ) {
- next unless $loader->is_supported;
- $supported = 1;
- my @configs
- = eval { $loader->load( $filename, $loader_args{ $loader } ); };
-
- # fatal error if we used extension matching
- croak "Error parsing $filename: $@" if $@ and $use_ext_lut;
- next if $@ or !@configs;
-
- # post-process config with a filter callback
- if ( $args->{ filter } ) {
- $args->{ filter }->( $_ ) for @configs;
- }
-
- push @results,
- { $filename => @configs == 1 ? $configs[ 0 ] : \@configs };
- last;
- }
-
- if ( !$supported ) {
- croak
- "Cannot load $filename: required support modules are not available.\nPlease install "
- . join( " OR ", map { _support_error( $_ ) } @try_plugins );
- }
- }
-
- if ( defined $args->{ flatten_to_hash } ) {
- my %flattened = map { %$_ } @results;
- return \%flattened;
- }
-
- return \@results;
-}
-
-sub _support_error {
- my $module = shift;
- if ( $module->can( 'requires_all_of' ) ) {
- return join( ' and ',
- map { ref $_ ? join( ' ', @$_ ) : $_ } $module->requires_all_of );
- }
- if ( $module->can( 'requires_any_of' ) ) {
- return 'one of '
- . join( ' or ',
- map { ref $_ ? join( ' ', @$_ ) : $_ } $module->requires_any_of );
- }
-}
-
-=head2 finder( )
-
-The C<finder()> classmethod returns the
-L<Module::Pluggable::Object|Module::Pluggable::Object>
-object which is used to load the plugins. See the documentation for that module for
-more information.
-
-=cut
-
-sub finder {
- my $class = shift;
- my $finder = Module::Pluggable::Object->new(
- search_path => [ __PACKAGE__ ],
- except => [ __PACKAGE__ . '::Base' ],
- require => 1
- );
- return $finder;
-}
-
-=head2 plugins( )
-
-The C<plugins()> classmethod returns the names of configuration loading plugins as
-found by L<Module::Pluggable::Object|Module::Pluggable::Object>.
-
-=cut
-
-sub plugins {
- my $class = shift;
-
- # filter out things that don't look like our plugins
- return grep { $_->isa( 'Config::Any::Base' ) } $class->finder->plugins;
-}
-
-=head2 extensions( )
-
-The C<extensions()> classmethod returns the possible file extensions which can be loaded
-by C<load_stems()> and C<load_files()>. This may be useful if you set the C<use_ext>
-parameter to those methods.
-
-=cut
-
-sub extensions {
- my $class = shift;
- my @ext
- = map { $_->extensions } $class->plugins;
- return wantarray ? @ext : \@ext;
-}
-
-=head1 DIAGNOSTICS
-
-=over
-
-=item C<No files specified!> or C<No stems specified!>
-
-The C<load_files()> and C<load_stems()> methods will issue this warning if
-called with an empty list of files/stems to load.
-
-=item C<_load requires a arrayref of file paths>
-
-This fatal error will be thrown by the internal C<_load> method. It should not occur
-but is specified here for completeness. If your code dies with this error, please
-email a failing test case to the authors below.
-
-=back
-
-=head1 CONFIGURATION AND ENVIRONMENT
-
-Config::Any requires no configuration files or environment variables.
-
-=head1 DEPENDENCIES
-
-L<Module::Pluggable|Module::Pluggable>
-
-And at least one of the following:
-L<Config::General|Config::General>
-L<Config::Tiny|Config::Tiny>
-L<JSON|JSON>
-L<YAML|YAML>
-L<JSON::Syck|JSON::Syck>
-L<YAML::Syck|YAML::Syck>
-L<XML::Simple|XML::Simple>
-
-=head1 INCOMPATIBILITIES
-
-None reported.
-
-=head1 BUGS AND LIMITATIONS
-
-No bugs have been reported.
-
-Please report any bugs or feature requests to
-C<bug-config-any at rt.cpan.org>, or through the web interface at
-L<http://rt.cpan.org>.
-
-=head1 AUTHOR
-
-Joel Bernstein E<lt>rataxis at cpan.orgE<gt>
-
-=head1 CONTRIBUTORS
-
-This module was based on the original
-L<Catalyst::Plugin::ConfigLoader|Catalyst::Plugin::ConfigLoader>
-module by Brian Cassidy C<< <bricas at cpan.org> >>.
-
-With ideas and support from Matt S Trout C<< <mst at shadowcatsystems.co.uk> >>.
-
-Further enhancements suggested by Evan Kaufman C<< <evank at cpan.org> >>.
-
-=head1 LICENCE AND COPYRIGHT
-
-Copyright (c) 2006, Portugal Telecom C<< http://www.sapo.pt/ >>. All rights reserved.
-Portions copyright 2007, Joel Bernstein C<< <rataxis at cpan.org> >>.
-
-This module is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself. See L<perlartistic>.
-
-=head1 DISCLAIMER OF WARRANTY
-
-BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
-YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR, OR CORRECTION.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-=head1 SEE ALSO
-
-L<Catalyst::Plugin::ConfigLoader|Catalyst::Plugin::ConfigLoader>
--- now a wrapper around this module.
-
-=cut
-
-"Drink more beer";
Copied: tags/Config-Any/0.19/lib/Config/Any.pm (from rev 12867, trunk/Config-Any/lib/Config/Any.pm)
===================================================================
--- tags/Config-Any/0.19/lib/Config/Any.pm (rev 0)
+++ tags/Config-Any/0.19/lib/Config/Any.pm 2010-02-15 14:03:57 UTC (rev 12868)
@@ -0,0 +1,388 @@
+package Config::Any;
+
+use strict;
+use warnings;
+
+use Carp;
+use Module::Pluggable::Object ();
+
+our $VERSION = '0.19';
+
+=head1 NAME
+
+Config::Any - Load configuration from different file formats, transparently
+
+=head1 SYNOPSIS
+
+ use Config::Any;
+
+ my $cfg = Config::Any->load_stems({stems => \@filepath_stems, ... });
+ # or
+ my $cfg = Config::Any->load_files({files => \@filepaths, ... });
+
+ for (@$cfg) {
+ my ($filename, $config) = %$_;
+ $class->config($config);
+ warn "loaded config from file: $filename";
+ }
+
+=head1 DESCRIPTION
+
+L<Config::Any|Config::Any> provides a facility for Perl applications and libraries
+to load configuration data from multiple different file formats. It supports XML, YAML,
+JSON, Apache-style configuration, Windows INI files, and even Perl code.
+
+The rationale for this module is as follows: Perl programs are deployed on many different
+platforms and integrated with many different systems. Systems administrators and end
+users may prefer different configuration formats than the developers. The flexibility
+inherent in a multiple format configuration loader allows different users to make
+different choices, without generating extra work for the developers. As a developer
+you only need to learn a single interface to be able to use the power of different
+configuration formats.
+
+=head1 INTERFACE
+
+=cut
+
+=head2 load_files( \%args )
+
+ Config::Any->load_files( { files => \@files } );
+ Config::Any->load_files( { files => \@files, filter => \&filter } );
+ Config::Any->load_files( { files => \@files, use_ext => 1 } );
+ Config::Any->load_files( { files => \@files, flatten_to_hash => 1 } );
+
+C<load_files()> attempts to load configuration from the list of files passed in
+the C<files> parameter, if the file exists.
+
+If the C<filter> parameter is set, it is used as a callback to modify the configuration
+data before it is returned. It will be passed a single hash-reference parameter which
+it should modify in-place.
+
+If the C<use_ext> parameter is defined, the loader will attempt to parse the file
+extension from each filename and will skip the file unless it matches a standard
+extension for the loading plugins. Only plugins whose standard extensions match the
+file extension will be used. For efficiency reasons, its use is encouraged, but
+be aware that you will lose flexibility -- for example, a file called C<myapp.cfg>
+containing YAML data will not be offered to the YAML plugin, whereas C<myapp.yml>
+or C<myapp.yaml> would be.
+
+When the C<flatten_to_hash> parameter is defined, the loader will return a hash
+keyed on the file names, as opposed to the usual list of single-key hashes.
+
+C<load_files()> also supports a 'force_plugins' parameter, whose value should be an
+arrayref of plugin names like C<Config::Any::INI>. Its intended use is to allow the use
+of a non-standard file extension while forcing it to be offered to a particular parser.
+It is not compatible with 'use_ext'.
+
+You can supply a C<driver_args> hashref to pass special options to a particular
+parser object. Example:
+
+ Config::Any->load_files( { files => \@files, driver_args => {
+ General => { -LowerCaseNames => 1 }
+ } )
+
+=cut
+
+sub load_files {
+ my ( $class, $args ) = @_;
+
+ unless ( $args && exists $args->{ files } ) {
+ warn "No files specified!";
+ return;
+ }
+
+ return $class->_load( $args );
+}
+
+=head2 load_stems( \%args )
+
+ Config::Any->load_stems( { stems => \@stems } );
+ Config::Any->load_stems( { stems => \@stems, filter => \&filter } );
+ Config::Any->load_stems( { stems => \@stems, use_ext => 1 } );
+ Config::Any->load_stems( { stems => \@stems, flatten_to_hash => 1 } );
+
+C<load_stems()> attempts to load configuration from a list of files which it generates
+by combining the filename stems list passed in the C<stems> parameter with the
+potential filename extensions from each loader, which you can check with the
+C<extensions()> classmethod described below. Once this list of possible filenames is
+built it is treated exactly as in C<load_files()> above, as which it takes the same
+parameters. Please read the C<load_files()> documentation before using this method.
+
+=cut
+
+sub load_stems {
+ my ( $class, $args ) = @_;
+
+ unless ( $args && exists $args->{ stems } ) {
+ warn "No stems specified!";
+ return;
+ }
+
+ my $stems = delete $args->{ stems };
+ my @files;
+ for my $s ( @$stems ) {
+ for my $ext ( $class->extensions ) {
+ push @files, "$s.$ext";
+ }
+ }
+
+ $args->{ files } = \@files;
+ return $class->_load( $args );
+}
+
+sub _load {
+ my ( $class, $args ) = @_;
+ croak "_load requires a arrayref of file paths" unless $args->{ files };
+
+ my $force = defined $args->{ force_plugins };
+ if ( !$force and !defined $args->{ use_ext } ) {
+ warn
+ "use_ext argument was not explicitly set, as of 0.09, this is true by default";
+ $args->{ use_ext } = 1;
+ }
+
+ # figure out what plugins we're using
+ my @plugins = $force
+ ? map { eval "require $_;"; $_; } @{ $args->{ force_plugins } }
+ : $class->plugins;
+
+ # map extensions if we have to
+ my ( %extension_lut, $extension_re );
+ my $use_ext_lut = !$force && $args->{ use_ext };
+ if ( $use_ext_lut ) {
+ for my $plugin ( @plugins ) {
+ for ( $plugin->extensions ) {
+ $extension_lut{ $_ } ||= [];
+ push @{ $extension_lut{ $_ } }, $plugin;
+ }
+ }
+
+ $extension_re = join( '|', keys %extension_lut );
+ }
+
+ # map args to plugins
+ my $base_class = __PACKAGE__;
+ my %loader_args;
+ for my $plugin ( @plugins ) {
+ $plugin =~ m{^$base_class\::(.+)};
+ $loader_args{ $plugin } = $args->{ driver_args }->{ $1 } || {};
+ }
+
+ my @results;
+
+ for my $filename ( @{ $args->{ files } } ) {
+
+ # don't even bother if it's not there
+ next unless -f $filename;
+
+ my @try_plugins = @plugins;
+
+ if ( $use_ext_lut ) {
+ $filename =~ m{\.($extension_re)\z};
+
+ if ( !$1 ) {
+ $filename =~ m{\.([^.]+)\z};
+ croak "There are no loaders available for .${1} files";
+ }
+
+ @try_plugins = @{ $extension_lut{ $1 } };
+ }
+
+ # not using use_ext means we try all plugins anyway, so we'll
+ # ignore it for the "unsupported" error
+ my $supported = $use_ext_lut ? 0 : 1;
+ for my $loader ( @try_plugins ) {
+ next unless $loader->is_supported;
+ $supported = 1;
+ my @configs
+ = eval { $loader->load( $filename, $loader_args{ $loader } ); };
+
+ # fatal error if we used extension matching
+ croak "Error parsing $filename: $@" if $@ and $use_ext_lut;
+ next if $@ or !@configs;
+
+ # post-process config with a filter callback
+ if ( $args->{ filter } ) {
+ $args->{ filter }->( $_ ) for @configs;
+ }
+
+ push @results,
+ { $filename => @configs == 1 ? $configs[ 0 ] : \@configs };
+ last;
+ }
+
+ if ( !$supported ) {
+ croak
+ "Cannot load $filename: required support modules are not available.\nPlease install "
+ . join( " OR ", map { _support_error( $_ ) } @try_plugins );
+ }
+ }
+
+ if ( defined $args->{ flatten_to_hash } ) {
+ my %flattened = map { %$_ } @results;
+ return \%flattened;
+ }
+
+ return \@results;
+}
+
+sub _support_error {
+ my $module = shift;
+ if ( $module->can( 'requires_all_of' ) ) {
+ return join( ' and ',
+ map { ref $_ ? join( ' ', @$_ ) : $_ } $module->requires_all_of );
+ }
+ if ( $module->can( 'requires_any_of' ) ) {
+ return 'one of '
+ . join( ' or ',
+ map { ref $_ ? join( ' ', @$_ ) : $_ } $module->requires_any_of );
+ }
+}
+
+=head2 finder( )
+
+The C<finder()> classmethod returns the
+L<Module::Pluggable::Object|Module::Pluggable::Object>
+object which is used to load the plugins. See the documentation for that module for
+more information.
+
+=cut
+
+sub finder {
+ my $class = shift;
+ my $finder = Module::Pluggable::Object->new(
+ search_path => [ __PACKAGE__ ],
+ except => [ __PACKAGE__ . '::Base' ],
+ require => 1
+ );
+ return $finder;
+}
+
+=head2 plugins( )
+
+The C<plugins()> classmethod returns the names of configuration loading plugins as
+found by L<Module::Pluggable::Object|Module::Pluggable::Object>.
+
+=cut
+
+sub plugins {
+ my $class = shift;
+
+ # filter out things that don't look like our plugins
+ return grep { $_->isa( 'Config::Any::Base' ) } $class->finder->plugins;
+}
+
+=head2 extensions( )
+
+The C<extensions()> classmethod returns the possible file extensions which can be loaded
+by C<load_stems()> and C<load_files()>. This may be useful if you set the C<use_ext>
+parameter to those methods.
+
+=cut
+
+sub extensions {
+ my $class = shift;
+ my @ext
+ = map { $_->extensions } $class->plugins;
+ return wantarray ? @ext : \@ext;
+}
+
+=head1 DIAGNOSTICS
+
+=over
+
+=item C<No files specified!> or C<No stems specified!>
+
+The C<load_files()> and C<load_stems()> methods will issue this warning if
+called with an empty list of files/stems to load.
+
+=item C<_load requires a arrayref of file paths>
+
+This fatal error will be thrown by the internal C<_load> method. It should not occur
+but is specified here for completeness. If your code dies with this error, please
+email a failing test case to the authors below.
+
+=back
+
+=head1 CONFIGURATION AND ENVIRONMENT
+
+Config::Any requires no configuration files or environment variables.
+
+=head1 DEPENDENCIES
+
+L<Module::Pluggable|Module::Pluggable>
+
+And at least one of the following:
+L<Config::General|Config::General>
+L<Config::Tiny|Config::Tiny>
+L<JSON|JSON>
+L<YAML|YAML>
+L<JSON::Syck|JSON::Syck>
+L<YAML::Syck|YAML::Syck>
+L<XML::Simple|XML::Simple>
+
+=head1 INCOMPATIBILITIES
+
+None reported.
+
+=head1 BUGS AND LIMITATIONS
+
+No bugs have been reported.
+
+Please report any bugs or feature requests to
+C<bug-config-any at rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org>.
+
+=head1 AUTHOR
+
+Joel Bernstein E<lt>rataxis at cpan.orgE<gt>
+
+=head1 CONTRIBUTORS
+
+This module was based on the original
+L<Catalyst::Plugin::ConfigLoader|Catalyst::Plugin::ConfigLoader>
+module by Brian Cassidy C<< <bricas at cpan.org> >>.
+
+With ideas and support from Matt S Trout C<< <mst at shadowcatsystems.co.uk> >>.
+
+Further enhancements suggested by Evan Kaufman C<< <evank at cpan.org> >>.
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2006, Portugal Telecom C<< http://www.sapo.pt/ >>. All rights reserved.
+Portions copyright 2007, Joel Bernstein C<< <rataxis at cpan.org> >>.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See L<perlartistic>.
+
+=head1 DISCLAIMER OF WARRANTY
+
+BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
+YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR, OR CORRECTION.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
+LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
+OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+=head1 SEE ALSO
+
+L<Catalyst::Plugin::ConfigLoader|Catalyst::Plugin::ConfigLoader>
+-- now a wrapper around this module.
+
+=cut
+
+"Drink more beer";
More information about the Catalyst-commits
mailing list