reworked __HOME__ to be a synonym for $c->path_to( '' )
[catagits/Catalyst-Plugin-ConfigLoader.git] / lib / Catalyst / Plugin / ConfigLoader.pm
index d1a5169..fc68afb 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.02';\r
+our $VERSION = '0.04';\r
 \r
 =head1 NAME\r
 \r
@@ -19,12 +20,13 @@ Catalyst::Plugin::ConfigLoader - Load config files of various types
 \r
     package MyApp;\r
     \r
-    use Catalyst( qw( ConfigLoader ... ) );\r
+    # ConfigLoader should be first in your list so\r
+    # other plugins can get the config information\r
+    use Catalyst qw( ConfigLoader ... );\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
@@ -37,8 +39,8 @@ INI and Perl formats.
 =head2 setup( )\r
 \r
 This method is automatically called by Catalyst's setup routine. It will\r
-attempt to use each plugin and set the C<config()> section once a file has been\r
-successfully loaded.\r
+attempt to use each plugin and, once a file has been successfully\r
+loaded, set the C<config()> section.\r
 \r
 =cut\r
 \r
@@ -69,9 +71,36 @@ 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 {\r
+            return unless defined $_;\r
+            s[__HOME__][ $c->path_to( '' ) ]e;\r
+            s[__path_to\((.+)\)__][ $c->path_to( split( '/', $1 ) ) ]e;\r
+        }\r
+    );\r
+    $v->visit( $c->config );\r
+}\r
+\r
 =head1 AUTHOR\r
 \r
 =over 4 \r
@@ -80,6 +109,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
@@ -97,4 +137,4 @@ it under the same terms as Perl itself.
 \r
 =cut\r
 \r
-1;
\ No newline at end of file
+1;\r