unify version numbers
[gitmo/MooseX-Getopt.git] / lib / MooseX / Getopt.pm
index 582c557..37d879f 100644 (file)
@@ -6,10 +6,12 @@ use MooseX::Getopt::OptionTypeMap;
 use MooseX::Getopt::Meta::Attribute;
 use MooseX::Getopt::Meta::Attribute::NoGetopt;
 
+use Carp ();
+
 use Getopt::Long (); # GLD uses it anyway, doesn't hurt
 use constant HAVE_GLD => not not eval { require Getopt::Long::Descriptive };
 
-our $VERSION   = '0.12';
+our $VERSION   = '0.17';
 our $AUTHORITY = 'cpan:STEVAN';
 
 has ARGV       => (is => 'rw', isa => 'ArrayRef', metaclass => "NoGetopt");
@@ -27,7 +29,7 @@ sub new_with_options {
         $opt_parser->getoptions( "configfile=s" => \$configfile );
 
         if(!defined $configfile) {
-            my $cfmeta = $class->meta->get_attribute('configfile');
+            my $cfmeta = $class->meta->find_attribute_by_name('configfile');
             $configfile = $cfmeta->default if $cfmeta->has_default;
         }
 
@@ -36,10 +38,16 @@ sub new_with_options {
         }
     }
 
+    my $constructor_params = ( @params == 1 ? $params[0] : {@params} );
+    
+    Carp::croak("Single parameters to new_with_options() must be a HASH ref")
+        unless ref($constructor_params) eq 'HASH';
+
     my %processed = $class->_parse_argv(
         options => [
             $class->_attrs_to_options( $config_from_file )
-        ]
+        ],
+        params => $constructor_params,
     );
 
     my $params = $config_from_file ? { %$config_from_file, %{$processed{params}} } : $processed{params};
@@ -121,13 +129,21 @@ sub _gld_spec {
 
     my ( @options, %name_to_init_arg );
 
+    my $constructor_params = $params{params};
+
     foreach my $opt ( @{ $params{options} } ) {
         push @options, [
             $opt->{opt_string},
             $opt->{doc} || ' ', # FIXME new GLD shouldn't need this hack
             {
-                ( $opt->{required} ? (required => $opt->{required}) : () ),
-                ( exists $opt->{default}  ? (default  => $opt->{default})  : () ),
+                ( ( $opt->{required} && !exists($constructor_params->{$opt->{init_arg}}) ) ? (required => $opt->{required}) : () ),
+                # NOTE:
+                # remove this 'feature' because it didn't work 
+                # all the time, and so is better to not bother
+                # since Moose will handle the defaults just 
+                # fine anyway.
+                # - SL
+                #( exists $opt->{default}  ? (default  => $opt->{default})  : () ),
             },
         ];
 
@@ -148,7 +164,7 @@ sub _compute_getopt_attrs {
         $_->name !~ /^_/
     } grep {
         !$_->does('MooseX::Getopt::Meta::Attribute::Trait::NoGetopt')
-    } $class->meta->compute_all_applicable_attributes
+    } $class->meta->get_all_attributes
 }
 
 sub _get_cmd_flags_for_attr {
@@ -178,9 +194,9 @@ sub _attrs_to_options {
         my $opt_string = join(q{|}, $flag, @aliases);
 
         if ($attr->has_type_constraint) {
-            my $type_name = $attr->type_constraint->name;
-            if (MooseX::Getopt::OptionTypeMap->has_option_type($type_name)) {
-                $opt_string .= MooseX::Getopt::OptionTypeMap->get_option_type($type_name)
+            my $type = $attr->type_constraint;
+            if (MooseX::Getopt::OptionTypeMap->has_option_type($type)) {
+                $opt_string .= MooseX::Getopt::OptionTypeMap->get_option_type($type)
             }
         }
 
@@ -189,7 +205,15 @@ sub _attrs_to_options {
             init_arg   => $attr->init_arg,
             opt_string => $opt_string,
             required   => $attr->is_required && !$attr->has_default && !$attr->has_builder && !exists $config_from_file->{$attr->name},
-            ( ( $attr->has_default && ( $attr->is_default_a_coderef xor $attr->is_lazy ) ) ? ( default => $attr->default({}) ) : () ),
+            # NOTE:
+            # this "feature" was breaking because 
+            # Getopt::Long::Descriptive would return 
+            # the default value as if it was a command 
+            # line flag, which would then override the
+            # one passed into a constructor.
+            # See 100_gld_default_bug.t for an example
+            # - SL
+            #( ( $attr->has_default && ( $attr->is_default_a_coderef xor $attr->is_lazy ) ) ? ( default => $attr->default({}) ) : () ),
             ( $attr->has_documentation ? ( doc => $attr->documentation ) : () ),
         }
     }
@@ -242,10 +266,12 @@ of your attribute as the command line option, and if there is a type
 constraint defined, it will configure Getopt::Long to handle the option
 accordingly.
 
-You can use the attribute metaclass L<MooseX::Getopt::Meta::Attribute>
-to get non-default commandline option names and aliases.
+You can use the trait L<MooseX::Getopt::Meta::Attribute::Trait> or the
+attribute metaclass L<MooseX::Getopt::Meta::Attribute> to get non-default
+commandline option names and aliases.
 
-You can use the attribute metaclass L<MooseX::Getopt::Meta::Attribute::NoGetOpt>
+You can use the trait L<MooseX::Getopt::Meta::Attribute::Trait::NoGetopt>
+or the attribute metaclass L<MooseX::Getopt::Meta::Attribute::NoGetopt>
 to have C<MooseX::Getopt> ignore your attribute in the commandline options.
 
 By default, attributes which start with an underscore are not given
@@ -423,6 +449,12 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 Brandon L. Black, E<lt>blblack@gmail.comE<gt>
 
+Yuval Kogman, E<lt>nothingmuch@woobling.orgE<gt>
+
+=head1 CONTRIBUTORS
+
+Ryan D Johnson, E<lt>ryan@innerfence.comE<gt>
+
 =head1 COPYRIGHT AND LICENSE
 
 Copyright 2007-2008 by Infinity Interactive, Inc.