[Catalyst-commits] r6716 - in trunk/Catalyst-Plugin-ConfigLoader: lib/Catalyst/Plugin t t/mockapp

bricas at dev.catalyst.perl.org bricas at dev.catalyst.perl.org
Wed Aug 22 19:18:46 GMT 2007


Author: bricas
Date: 2007-08-22 19:18:46 +0100 (Wed, 22 Aug 2007)
New Revision: 6716

Modified:
   trunk/Catalyst-Plugin-ConfigLoader/lib/Catalyst/Plugin/ConfigLoader.pm
   trunk/Catalyst-Plugin-ConfigLoader/t/20-mock_load.t
   trunk/Catalyst-Plugin-ConfigLoader/t/mockapp/mockapp.pl
Log:
allow custom macros or overriding of config_substitutions() sub.

Modified: trunk/Catalyst-Plugin-ConfigLoader/lib/Catalyst/Plugin/ConfigLoader.pm
===================================================================
--- trunk/Catalyst-Plugin-ConfigLoader/lib/Catalyst/Plugin/ConfigLoader.pm	2007-08-22 17:05:51 UTC (rev 6715)
+++ trunk/Catalyst-Plugin-ConfigLoader/lib/Catalyst/Plugin/ConfigLoader.pm	2007-08-22 18:18:46 UTC (rev 6716)
@@ -217,11 +217,8 @@
 at runtime. If you need to do this to properly configure any
 plugins, it's important to load ConfigLoader before them.
 ConfigLoader provides a default finalize_config method which
-walks through the loaded config hash and replaces any strings
-beginning containing C<__HOME__> with the full path to
-app's home directory (i.e. C<$c-E<gt>path_to('')> ).
-You can also use C<__path_to(foo/bar)__> which translates to
-C<$c-E<gt>path_to('foo', 'bar')> 
+walks through the loaded config hash and calls the C<config_substitutions>
+sub on any string.
 
 =cut
 
@@ -230,13 +227,54 @@
     my $v = Data::Visitor::Callback->new(
         plain_value => sub {
             return unless defined $_;
-            s{__HOME__}{ $c->path_to( '' ) }eg;
-            s{__path_to\((.+?)\)__}{ $c->path_to( split( '/', $1 ) ) }eg;
+            $c->config_substitutions( $_ );
         }
     );
     $v->visit( $c->config );
 }
 
+=head2 config_substitutions( $value )
+
+This method substitutes macros found with calls to a function. There are three
+default macros:
+
+=over 4
+
+=item * C<__HOME__> - replaced with C<$c-E<gt>path_to('')>
+
+=item * C<__path_to(foo/bar)__> - replaced with C<$c-E<gt>path_to('foo/bar')>
+
+=item * C<__literal(__FOO__)__> - leaves __FOO__ alone (allows you to use
+C<__DATA__> as a config value, for example)
+
+=back
+
+The parameter list is split on comma (C<,>). You can override this method to
+do your own string munging, or you can define your own macros in
+C<MyApp->config->{ substitutions }>. Example:
+
+    MyApp->config->{ substitutions } = {
+        baz => sub { my $c = shift; qux( @_ ); }
+    }
+
+The above will respond to C<__baz(x,y)__> in config strings.
+
+=cut
+
+sub config_substitutions {
+    my $c = shift;
+    my $subs = $c->config->{ substitutions } || {};
+    $subs->{ HOME } ||= sub { shift->path_to( '' ); };
+    $subs->{ path_to } ||= sub { shift->path_to( @_ ); };
+    $subs->{ literal } ||= sub { return $_[ 1 ]; };
+    my $subsre = join( '|', keys %$subs );
+
+    for ( @_ ) {
+        s{__($subsre)(?:\((.+?)\))?__}{ $subs->{ $1 }->( $c, $2 ? split( /,/, $2 ) : () ) }eg;
+    }
+}
+
+
 =head1 AUTHOR
 
 Brian Cassidy E<lt>bricas at cpan.orgE<gt>

Modified: trunk/Catalyst-Plugin-ConfigLoader/t/20-mock_load.t
===================================================================
--- trunk/Catalyst-Plugin-ConfigLoader/t/20-mock_load.t	2007-08-22 17:05:51 UTC (rev 6715)
+++ trunk/Catalyst-Plugin-ConfigLoader/t/20-mock_load.t	2007-08-22 18:18:46 UTC (rev 6716)
@@ -1,12 +1,16 @@
 package MockApp;
 
-use Test::More tests => 7;
+use Test::More tests => 9;
 
 use Cwd;
 $ENV{ CATALYST_HOME } = cwd . '/t/mockapp';
 
 use_ok( 'Catalyst', qw( ConfigLoader ) );
 
+__PACKAGE__->config->{ substitutions } = {
+    foo => sub { shift; join('-', @_); }
+};
+
 __PACKAGE__->setup;
 
 ok( __PACKAGE__->config );
@@ -15,3 +19,5 @@
 is( __PACKAGE__->config->{ 'Model::Baz' }->{ qux }, 'xyzzy' );
 is( __PACKAGE__->config->{ 'Model::Baz' }->{ another }, 'new key' );
 is( __PACKAGE__->config->{ 'view' }, 'View::TT::New' );
+is( __PACKAGE__->config->{ 'foo_sub' }, 'x-y' );
+is( __PACKAGE__->config->{ 'literal_macro' }, '__DATA__' );

Modified: trunk/Catalyst-Plugin-ConfigLoader/t/mockapp/mockapp.pl
===================================================================
--- trunk/Catalyst-Plugin-ConfigLoader/t/mockapp/mockapp.pl	2007-08-22 17:05:51 UTC (rev 6715)
+++ trunk/Catalyst-Plugin-ConfigLoader/t/mockapp/mockapp.pl	2007-08-22 18:18:46 UTC (rev 6716)
@@ -6,5 +6,7 @@
     },
     'Model::Baz' => {
         qux => 'xyzzy'
-    }
+    },
+    foo_sub => '__foo(x,y)__',
+    literal_macro => '__literal(__DATA__)__',
 }




More information about the Catalyst-commits mailing list