create_makefile_pl => 'traditional',\r
requires => {\r
'Catalyst' => 0,\r
- 'File::Slurp' => 0\r
+ #'File::Slurp' => 0,\r
+ 'Data::Visitor' => 0.02,\r
},\r
);\r
\r
Revision history for Perl extension Catalyst::Plugin::ConfigLoader.\r
\r
+0.04 Wed Feb 08 2006\r
+ - add finalize_config method\r
+ - make default finalize_config traverse the config and substitute\r
+ things beginning __HOME__/* with real path\r
+ - don't use File::Slurp, not sure how to eliminate warnings\r
+\r
0.03 Mon Jan 30 2006\r
- - pod fixes\r
+ - pod fixes\r
\r
0.02 Sun Jan 29 2006\r
- - refactoring (suggested by Christian Hansen)\r
+ - refactoring (suggested by Christian Hansen)\r
\r
0.01 Sat Jan 28 2006\r
- - original version
\ No newline at end of file
+ - original version
\ No newline at end of file
name => '_config_loaders',\r
search => [ __PACKAGE__ ],\r
require => 1;\r
+use Data::Visitor::Callback;\r
\r
-our $VERSION = '0.03';\r
+our $VERSION = '0.04';\r
\r
=head1 NAME\r
\r
\r
# by default myapp.* will be loaded\r
# you can specify a file if you'd like\r
- __PACKAGE__->config( file = > 'config.yaml' );\r
- \r
+ __PACKAGE__->config( file = > 'config.yaml' ); \r
\r
=head1 DESCRIPTION\r
\r
}\r
}\r
\r
+ $c->finalize_config;\r
+\r
$c->NEXT::setup( @_ );\r
}\r
\r
+=head2 finalize_config\r
+\r
+This method is called after the config file is loaded. It can be\r
+used to implement tuning of config values that can only be done\r
+at runtime. If you need to do this to properly configure any\r
+plugins, it's important to load ConfigLoader before them.\r
+ConfigLoader provides a default finalize_config method which\r
+walks through the loaded config hash and replaces any strings\r
+beginning with C<< __HOME__/<path> >> with the full path to\r
+the file inside the app's home directory.\r
+\r
+=cut\r
+\r
+sub finalize_config {\r
+ my $c = shift;\r
+ my $v = Data::Visitor::Callback->new(\r
+ plain_value => sub { s[^__HOME__/(.+)$][ $c->path_to($1) ]e }\r
+ );\r
+ $v->visit($c->config);\r
+}\r
+\r
=head1 AUTHOR\r
\r
=over 4 \r
use strict;\r
use warnings;\r
\r
-use File::Slurp;\r
+#use File::Slurp; \r
\r
=head1 NAME\r
\r
use strict;\r
use warnings;\r
\r
-use File::Slurp;\r
+#use File::Slurp;\r
\r
=head1 NAME\r
\r
use FindBin;\r
use lib "$FindBin::Bin/lib";\r
\r
-use Test::More tests => 2;\r
+use Test::More tests => 4;\r
\r
use Catalyst::Test 'TestApp';\r
\r
{\r
- ok( my $response = request('http://localhost/config/'), 'request ok' );\r
+ my $response;\r
+ ok( $response = request('http://localhost/config/'), 'request ok' );\r
is( $response->content, 'foo', 'config ok' );\r
+\r
+ $response = request('http://localhost/appconfig/cache');\r
+ ok( $response->content !~ /^__HOME__/, 'home dir substituted in config var' );\r
+\r
+ $response = request('http://localhost/appconfig/foo');\r
+ is( $response->content, 'bar', 'app finalize_config works' );\r
}\r
__PACKAGE__->setup;
+sub finalize_config {
+ my $c = shift;
+ $c->config(foo => 'bar');
+ $c->NEXT::finalize_config;
+}
+
+sub appconfig : Local {
+ my ($self,$c,$var) = @_;
+ $c->res->body($c->config->{$var});
+}
+
1;
name => 'TestApp',
Controller::Config => {
foo => 'foo'
- }
+ },
+ cache => '__HOME__/cache',
}