0.10 - support default configfile w/ MX::ConfigFromFile
[gitmo/MooseX-Getopt.git] / lib / MooseX / Getopt.pm
index 2e4c96a..d7898f7 100644 (file)
@@ -9,11 +9,11 @@ use MooseX::Getopt::Meta::Attribute::NoGetopt;
 use Getopt::Long (); # GLD uses it anyway, doesn't hurt
 use constant HAVE_GLD => not not eval { require Getopt::Long::Descriptive };
 
-our $VERSION   = '0.08';
+our $VERSION   = '0.10';
 our $AUTHORITY = 'cpan:STEVAN';
 
-has ARGV       => (is => 'rw', isa => 'ArrayRef', documentation => "hidden");
-has extra_argv => (is => 'rw', isa => 'ArrayRef', documentation => "hidden");
+has ARGV       => (is => 'rw', isa => 'ArrayRef', metaclass => "NoGetopt");
+has extra_argv => (is => 'rw', isa => 'ArrayRef', metaclass => "NoGetopt");
 
 sub new_with_options {
     my ($class, @params) = @_;
@@ -26,12 +26,23 @@ sub new_with_options {
 
     my $params = $processed{params};
 
-    if($class->meta->does_role('MooseX::ConfigFromFile')
-       && defined $params->{configfile}) {
-        %$params = (
-            %{$class->get_config_from_file($params->{configfile})},
-            %$params,
-        );
+    if($class->meta->does_role('MooseX::ConfigFromFile')) {
+        my $configfile;
+
+        if(defined $params->{configfile}) {
+            $configfile = $params->{configfile}
+        }
+        else {
+            my $cfmeta = $class->meta->get_attribute('configfile');
+            $configfile = $cfmeta->default if $cfmeta->has_default;
+        }
+
+        if(defined $configfile) {
+            %$params = (
+                %{$class->get_config_from_file($configfile)},
+                %$params,
+            );
+        }
     }
 
     $class->new(
@@ -62,7 +73,7 @@ sub _parse_argv {
         } else {
             my %options;
             Getopt::Long::GetOptions(\%options, @$opt_spec);
-            return ( \%options, MooseX::Getopt::FakeUsage->new(%params) );
+            return ( \%options, undef );
         }
     };
 
@@ -81,7 +92,7 @@ sub _parse_argv {
         params    => \%constructor_args,
         argv_copy => $argv_copy,
         argv      => $argv_mangled,
-        usage     => $usage
+        ( defined($usage) ? ( usage => $usage ) : () ),
     );
 }
 
@@ -173,39 +184,6 @@ sub _attrs_to_options {
     return @options;
 }
 
-{
-    package MooseX::Getopt::FakeUsage;
-    use Moose;
-    # fakes Getopt::Long::Descriptive::Usage
-    
-    has text => (
-        isa => "Str",
-        is  => "rw",
-        default => "In order to get a usage text please install Getopt::Long::Descriptive\n",
-    );
-
-    sub warn {
-        my $self = shift;
-        warn $self->text;
-    }
-
-    sub die  { 
-        my $self = shift;
-        my $arg  = shift || {};
-
-        die(
-            join(
-                "", 
-                grep { defined } $arg->{pre_text}, $self->text, $arg->{post_text},
-            )
-        );
-    }
-
-    use overload (
-        q{""} => "text",
-    );
-}
-
 no Moose::Role; 1;
 
 __END__
@@ -274,7 +252,12 @@ code can still call the C<foo> method.
 If your class also uses a configfile-loading role based on
 L<MooseX::ConfigFromFile>, such as L<MooseX::SimpleConfig>,
 L<MooseX::Getopt>'s C<new_with_options> will load the configfile
-specified by the C<--configfile> option for you.
+specified by the C<--configfile> option (or the default you've
+given for the configfile attribute) for you.
+
+Options specified in multiple places follow the following
+precendence order: commandline overrides configfile, which
+overrides explicit new_with_options parameters.
 
 =head2 Supported Type Constraints
 
@@ -395,6 +378,9 @@ and then return a newly constructed object.
 If L<Getopt::Long/GetOptions> fails (due to invalid arguments),
 C<new_with_options> will throw an exception.
 
+If you have L<Getopt::Long::Descriptive> a the C<usage> param is also passed to
+C<new>.
+
 =item B<ARGV>
 
 This accessor contains a reference to a copy of the C<@ARGV> array