Revision history for Perl extension Catalyst::Plugin::ConfigLoader.\r
\r
+0.02 Sun Jan 29 2006\r
+ - refactoring (suggested by Christian Hansen)\r
+\r
0.01 Sat Jan 28 2006\r
- original version
\ No newline at end of file
search => [ __PACKAGE__ ],\r
require => 1;\r
\r
-our $VERSION = '0.01';\r
+our $VERSION = '0.02';\r
\r
=head1 NAME\r
\r
\r
=head1 SYNOPSIS\r
\r
- package MyApp;\r
- \r
- use Catalyst( ConfigLoader );\r
+ package MyApp;\r
+ \r
+ use Catalyst( ConfigLoader );\r
\r
# by default myapp.* will be loaded\r
# you can specify a file if you'd like\r
=cut\r
\r
sub setup {\r
- my $c = shift;\r
- my $confpath = $c->config->{ file } || $c->path_to( Catalyst::Utils::appprefix( ref $c || $c ) );\r
+ my $c = shift;\r
+ my $path = $c->config->{ file } || $c->path_to( Catalyst::Utils::appprefix( ref $c || $c ) );\r
+\r
+ my( $extension ) = ( $path =~ /\.(.{1,4})$/ );\r
\r
for my $loader ( $c->_config_loaders ) {\r
- my $config = $loader->load( $confpath );\r
- if( $config ) {\r
- $c->config( $config );\r
- last;\r
+ my @files;\r
+ my @extensions = $loader->extensions;\r
+ if( $extension ) {\r
+ next unless grep { $_ eq $extension } @extensions;\r
+ push @files, $path;\r
+ }\r
+ else {\r
+ push @files, "$path.$_" for @extensions;\r
+ }\r
+\r
+ for( @files ) {\r
+ next unless -f $_;\r
+ my $config = $loader->load( $_ );\r
+ if( $config ) {\r
+ $c->config( $config );\r
+ last;\r
+ }\r
}\r
}\r
\r
\r
name=TestApp\r
\r
- [Controller::Config]\r
+ [Controller::Foo]\r
foo=bar\r
\r
=head1 METHODS\r
\r
+=head2 extensions( )\r
+\r
+return an array of valid extensions (C<ini>).\r
+\r
+=cut\r
+\r
+sub extensions {\r
+ return qw( ini );\r
+}\r
+\r
=head2 load( $file )\r
\r
Attempts to load C<$file> as an INI file.\r
=cut\r
\r
sub load {\r
- my $class = shift;\r
- my $confpath = shift;\r
-\r
- my $file;\r
- if( $confpath =~ /\.(.{3})$/ ) {\r
- return unless $1 eq 'ini';\r
- $file = $confpath;\r
- }\r
- else {\r
- $file = "$confpath.ini";\r
- }\r
- \r
- return unless -f $file;\r
+ my $class = shift;\r
+ my $file = shift;\r
\r
require Config::Tiny;\r
my $config = Config::Tiny->read( $file );\r
my $main = delete $config->{ _ };\r
+ \r
$config->{ $_ } = $main->{ $_ } for keys %$main;\r
\r
return $config;\r
\r
=item * L<Catalyst>\r
\r
+=item * <Catalyst::Plugin::ConfigLoader>\r
+\r
=back\r
\r
=cut\r
\r
{\r
"name": "TestApp",\r
- "Controller::Config": {\r
+ "Controller::Foo": {\r
"foo": "bar"\r
}\r
}\r
\r
=head1 METHODS\r
\r
+=head2 extensions( )\r
+\r
+return an array of valid extensions (C<json>, C<jsn>).\r
+\r
+=cut\r
+\r
+sub extensions {\r
+ return qw( json jsn );\r
+}\r
+\r
=head2 load( $file )\r
\r
Attempts to load C<$file> as a JSON file.\r
=cut\r
\r
sub load {\r
- my $class = shift;\r
- my $confpath = shift;\r
+ my $class = shift;\r
+ my $file = shift;\r
\r
- my @files;\r
- if( $confpath =~ /\.(.{3,4})$/ ) {\r
- return unless $1 =~ /^jso?n$/;\r
- @files = $confpath;\r
+ my $content = read_file( $file );\r
+\r
+ eval { require JSON::Syck; };\r
+ if( $@ ) {\r
+ require JSON;\r
+ JSON->import;\r
+ return jsonToObj( $content );\r
}\r
else {\r
- @files = map { "$confpath.$_" } qw( json jsn );\r
- }\r
- \r
- for my $file ( @files ) {\r
- next unless -f $file;\r
- \r
- my $content = read_file( $file );\r
-\r
- eval { require JSON::Syck; };\r
- if( $@ ) {\r
- require JSON;\r
- JSON->import;\r
- return jsonToObj( $content );\r
- }\r
- else {\r
- return JSON::Syck::Load( $content );\r
- }\r
+ return JSON::Syck::Load( $content );\r
}\r
}\r
\r
\r
=item * L<Catalyst>\r
\r
+=item * <Catalyst::Plugin::ConfigLoader>\r
+\r
=back\r
\r
=cut\r
\r
{\r
name => 'TestApp',\r
- Controller::Config => {\r
+ Controller::Foo => {\r
foo => 'bar'\r
}\r
}\r
\r
=head1 METHODS\r
\r
+=head2 extensions( )\r
+\r
+return an array of valid extensions (C<pl>, C<perl>).\r
+\r
+=cut\r
+\r
+sub extensions {\r
+ return qw( pl perl );\r
+}\r
+\r
=head2 load( $file )\r
\r
Attempts to load C<$file> as a Perl file.\r
=cut\r
\r
sub load {\r
- my $class = shift;\r
- my $confpath = shift;\r
+ my $class = shift;\r
+ my $file = shift;\r
\r
- my @files;\r
- if( $confpath =~ /\.(.{2,4})$/ ) {\r
- return unless $1 =~ /^p(er)?l$/;\r
- @files = $confpath;\r
- }\r
- else {\r
- @files = map { "$confpath.$_" } qw( pl perl );\r
- }\r
- \r
- for my $file ( @files ) {\r
- next unless -f $file;\r
- return eval { require $file };\r
- }\r
+ return eval { require $file };\r
}\r
\r
=head1 AUTHOR\r
\r
=item * L<Catalyst>\r
\r
+=item * <Catalyst::Plugin::ConfigLoader>\r
+\r
=back\r
\r
=cut\r
\r
<config>\r
<name>TestApp</name>\r
- <component name="Controller::Config">\r
+ <component name="Controller::Foo">\r
<foo>bar</foo>\r
</component>\r
</config>\r
\r
=head1 METHODS\r
\r
+=head2 extensions( )\r
+\r
+return an array of valid extensions (C<xml>).\r
+\r
+=cut\r
+\r
+sub extensions {\r
+ return qw( xml );\r
+}\r
+\r
=head2 load( $file )\r
\r
Attempts to load C<$file> as an XML file.\r
=cut\r
\r
sub load {\r
- my $class = shift;\r
- my $confpath = shift;\r
-\r
- my $file;\r
- if( $confpath =~ /\.(.{3})$/ ) {\r
- return unless $1 eq 'xml';\r
- $file = $confpath;\r
- }\r
- else {\r
- $file = "$confpath.xml";\r
- }\r
- \r
- return unless -f $file;\r
+ my $class = shift;\r
+ my $file = shift;\r
\r
require XML::Simple;\r
XML::Simple->import;\r
- my $config = XMLin( $file, ForceArray => [ 'component' ] );\r
+ my $config = XMLin( $file, ForceArray => [ 'component' ] );\r
\r
my $components = delete $config->{ component };\r
foreach my $element ( keys %$components ) {\r
\r
=item * L<Catalyst>\r
\r
+=item * <Catalyst::Plugin::ConfigLoader>\r
+\r
=back\r
\r
=cut\r
\r
---\r
name: TestApp\r
- Controller::Config:\r
+ Controller::Foo:\r
foo: bar\r
\r
=head1 METHODS\r
\r
+=head2 extensions( )\r
+\r
+return an array of valid extensions (C<yml>, C<yaml>).\r
+\r
+=cut\r
+\r
+sub extensions {\r
+ return qw( yml yaml );\r
+}\r
+\r
=head2 load( $file )\r
\r
Attempts to load C<$file> as a YAML file.\r
=cut\r
\r
sub load {\r
- my $class = shift;\r
- my $confpath = shift;\r
+ my $class = shift;\r
+ my $file = shift;\r
\r
- my @files;\r
- if( $confpath =~ /\.(.{3,4})$/ ) {\r
- return unless $1 =~ /^ya?ml$/;\r
- @files = $confpath;\r
+ eval { require YAML::Syck; };\r
+ if( $@ ) {\r
+ require YAML;\r
+ return YAML::LoadFile( $file );\r
}\r
else {\r
- @files = map { "$confpath.$_" } qw( yml yaml );\r
- }\r
- \r
- for my $file ( @files ) {\r
- next unless -f $file;\r
-\r
- eval { require YAML::Syck; };\r
- if( $@ ) {\r
- require YAML;\r
- return YAML::LoadFile( $file );\r
- }\r
- else {\r
- my $content = read_file( $file );\r
- return YAML::Syck::Load( $content );\r
- }\r
+ my $content = read_file( $file );\r
+ return YAML::Syck::Load( $content );\r
}\r
}\r
\r
\r
=item * L<Catalyst>\r
\r
+=item * <Catalyst::Plugin::ConfigLoader>\r
+\r
=back\r
\r
=cut\r