use Getopt::Long (); # GLD uses it anyway, doesn't hurt
use constant HAVE_GLD => not not eval { require Getopt::Long::Descriptive };
-our $VERSION = '0.21';
+our $VERSION = '0.25';
our $AUTHORITY = 'cpan:STEVAN';
has ARGV => (is => 'rw', isa => 'ArrayRef', metaclass => "NoGetopt");
}
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';
# did the user request usage information?
if ( $processed{usage} && ($params->{'?'} or $params->{help} or $params->{usage}) )
{
- $processed{usage}->die();
+ $class->_getopt_full_usage($processed{usage});
}
$class->new(
# Get a clean copy of the original @ARGV
my $argv_copy = [ @ARGV ];
- my @err;
-
+ my @warnings;
my ( $parsed_options, $usage ) = eval {
- local $SIG{__WARN__} = sub { push @err, @_ };
+ local $SIG{__WARN__} = sub { push @warnings, @_ };
if ( HAVE_GLD ) {
return Getopt::Long::Descriptive::describe_options($class->_usage_format(%params), @$opt_spec);
}
};
- die join "", grep { defined } @err, $@ if @err or $@;
+ $class->_getopt_spec_warnings(@warnings) if @warnings;
+ $class->_getopt_spec_exception(\@warnings, $@) if $@;
# Get a copy of the Getopt::Long-mangled @ARGV
my $argv_mangled = [ @ARGV ];
);
}
+sub _getopt_spec_warnings { }
+
+sub _getopt_spec_exception {
+ my ($self, $warnings, $exception) = @_;
+ die @$warnings, $exception;
+}
+
+sub _getopt_full_usage {
+ my ($self, $usage) = @_;
+ $usage->die;
+}
+
sub _usage_format {
return "usage: %c %o";
}
foreach my $opt ( @{ $params{options} } ) {
push @options, $opt->{opt_string};
- my $identifier = $opt->{name};
+ my $identifier = lc($opt->{name});
$identifier =~ s/\W/_/g; # Getopt::Long does this to all option names
$name_to_init_arg{$identifier} = $opt->{init_arg};
},
];
- my $identifier = $opt->{name};
+ my $identifier = lc($opt->{name});
$identifier =~ s/\W/_/g; # Getopt::Long does this to all option names
$name_to_init_arg{$identifier} = $opt->{init_arg};
params from the command line (possibly overriding those in C<%params>)
and then return a newly constructed object.
-The special parameter C<argv>, if specified should point to an array
+The special parameter C<argv>, if specified should point to an array
reference with an array to use instead of C<@ARGV>.
If L<Getopt::Long/GetOptions> fails (due to invalid arguments),