if configfile is a coderef call it and write some tests for it topic/configfile_default_codref_call
Gordon Irving [Thu, 27 Aug 2009 15:09:04 +0000 (16:09 +0100)]
lib/MooseX/Getopt.pm
t/008_configfromfile.t

index 4550082..d0dbb3f 100644 (file)
@@ -31,6 +31,11 @@ sub new_with_options {
         if(!defined $configfile) {
             my $cfmeta = $class->meta->find_attribute_by_name('configfile');
             $configfile = $cfmeta->default if $cfmeta->has_default;
+            if (ref $configfile eq 'CODE') {
+                # not sure theres a lot you can do with the class and may break some assumptions
+                # warn?
+                $configfile = &$configfile($class);
+            }
             if (defined $configfile) {
                 $config_from_file = eval {
                     $class->get_config_from_file($configfile);
index 292e6f5..62e6ed9 100644 (file)
@@ -13,7 +13,7 @@ if ( !eval { require MooseX::ConfigFromFile } )
 }
 else
 {
-    plan tests => 25;
+    plan tests => 37;
 }
 
 {
@@ -76,6 +76,17 @@ else
     );
 }
 
+{
+    package App::DefaultConfigFileCodeRef;
+
+    use Moose;
+    extends 'App';
+
+    has '+configfile' => (
+        default => sub { return File::Spec->canonpath('/notused/default') },
+    );
+}
+
 # No config specified
 {
     local @ARGV = qw( --required_from_argv 1 );
@@ -95,6 +106,23 @@ else
     }
 }
 
+# No config specified
+{
+    local @ARGV = qw( --required_from_argv 1 );
+
+    {
+        my $app = App::DefaultConfigFileCodeRef->new_with_options;
+        isa_ok( $app, 'App::DefaultConfigFileCodeRef' );
+        app_ok( $app );
+
+        ok(  !$app->config_from_override,
+            '... config_from_override false as expected' );
+
+        is( $app->configfile, File::Spec->canonpath('/notused/default'),
+            '... configfile is /notused/default as expected' );
+    }
+}
+
 # Config specified
 {
     local @ARGV = qw( --configfile /notused --required_from_argv 1 );
@@ -116,6 +144,17 @@ else
         is( $app->configfile, File::Spec->canonpath('/notused'),
             '... configfile is /notused as expected' );
     }
+    {
+        my $app = App::DefaultConfigFileCodeRef->new_with_options;
+        isa_ok( $app, 'App::DefaultConfigFileCodeRef' );
+        app_ok( $app );
+
+        ok( $app->config_from_override,
+             '... config_from_override true as expected' );
+
+        is( $app->configfile, File::Spec->canonpath('/notused'),
+            '... configfile is /notused as expected' );
+    }
 }
 
 # Required arg not supplied from cmdline