X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMooseX-Getopt.git;a=blobdiff_plain;f=lib%2FMooseX%2FGetopt.pm;h=7011a5584e3e04ae46494d56a898a21a3ef20780;hp=3dfd63245c9c4617141655181fb3c58de4baa87a;hb=6bb4cb66b12d95e6e9bb764eed6fb10cb55383ea;hpb=384fb15d47f2d28e63951b5f5e6be6df28bb87c8 diff --git a/lib/MooseX/Getopt.pm b/lib/MooseX/Getopt.pm index 3dfd632..7011a55 100644 --- a/lib/MooseX/Getopt.pm +++ b/lib/MooseX/Getopt.pm @@ -2,7 +2,7 @@ package MooseX::Getopt; use Moose::Role; -use Getopt::Long (); +use Getopt::Long::Descriptive (); use MooseX::Getopt::OptionTypeMap; use MooseX::Getopt::Meta::Attribute; @@ -46,20 +46,32 @@ sub _parse_argv { local @ARGV = @{ $params{argv} || \@ARGV }; - my ( @options, %name_to_init_arg, %options ); + my ( @options, %name_to_init_arg ); foreach my $opt ( @{ $params{options} } ) { - push @options, $opt->{opt_string}; + push @options, [ + $opt->{opt_string}, + $opt->{doc} || ' ', + { + ( $opt->{required} ? (required => $opt->{required}) : () ), + ( exists $opt->{default} ? (default => $opt->{default}) : () ), + }, + ]; + $name_to_init_arg{ $opt->{name} } = $opt->{init_arg}; } # Get a clean copy of the original @ARGV my $argv_copy = [ @ARGV ]; - { - local $SIG{__WARN__} = sub { die $_[0] }; - Getopt::Long::GetOptions(\%options, @options); - } + my @err; + + my ( $parsed_options, $usage ) = eval { + local $SIG{__WARN__} = sub { push @err, @_ }; + Getopt::Long::Descriptive::describe_options("usage: %c %o", @options) + }; + + die join "", grep { defined } @err, $@ if @err or $@; # Get a copy of the Getopt::Long-mangled @ARGV my $argv_mangled = [ @ARGV ]; @@ -69,8 +81,8 @@ sub _parse_argv { argv => $argv_mangled, params => { map { - $name_to_init_arg{$_} => $options{$_} - } keys %options, + $name_to_init_arg{$_} => $parsed_options->{$_} + } keys %$parsed_options, } ); } @@ -107,8 +119,8 @@ sub _attrs_to_options { 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); + if (MooseX::Getopt::OptionTypeMap->has_option_type($type_name)) { + $opt_string .= MooseX::Getopt::OptionTypeMap->get_option_type($type_name) } } @@ -117,6 +129,7 @@ sub _attrs_to_options { init_arg => $attr->init_arg, opt_string => $opt_string, required => $attr->is_required, + ( ( $attr->has_default && ( $attr->is_default_a_coderef xor $attr->is_lazy ) ) ? ( default => $attr->default({}) ) : () ), ( $attr->has_documentation ? ( doc => $attr->documentation ) : () ), } }