update ConfigLoader in Catalyst dist
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Plugin / ConfigLoader.pm
index 0ba9f99..0fcbc70 100644 (file)
@@ -8,8 +8,9 @@ use Module::Pluggable::Fast
     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
@@ -25,8 +26,7 @@ Catalyst::Plugin::ConfigLoader - Load config files of various types
        \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
@@ -71,9 +71,32 @@ sub setup {
         }\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
@@ -82,6 +105,17 @@ sub setup {
 \r
 =back\r
 \r
+=head1 CONTRIBUTORS\r
+\r
+The following people have generously donated their time to the\r
+development of this module:\r
+\r
+=over 4\r
+\r
+=item * David Kamholz E<lt>dkamholz@cpan.orgE<gt>\r
+\r
+=back\r
+\r
 =head1 COPYRIGHT AND LICENSE\r
 \r
 Copyright 2006 by Brian Cassidy\r