From: Yuval Kogman Date: Mon, 21 Jan 2008 16:45:32 +0000 (+0000) Subject: further refactorings to benefit MooseX::App::Cmd X-Git-Tag: 0_09~1^2~6 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0e71533653c75c9133989d19dad127a8861760cf;p=gitmo%2FMooseX-Getopt.git further refactorings to benefit MooseX::App::Cmd --- diff --git a/lib/MooseX/Getopt.pm b/lib/MooseX/Getopt.pm index 7011a55..4e37238 100644 --- a/lib/MooseX/Getopt.pm +++ b/lib/MooseX/Getopt.pm @@ -42,24 +42,23 @@ sub new_with_options { } sub _parse_argv { - my ( $class, %params ) = @_; + my ( $class, @args ) = @_; - local @ARGV = @{ $params{argv} || \@ARGV }; + my ( $params, $argv_copy, $argv_mangled ) = $class->_call_getopt(@args); - my ( @options, %name_to_init_arg ); + return ( + argv_copy => $argv_copy, + argv => $argv_mangled, + params => $params, + ); +} - foreach my $opt ( @{ $params{options} } ) { - push @options, [ - $opt->{opt_string}, - $opt->{doc} || ' ', - { - ( $opt->{required} ? (required => $opt->{required}) : () ), - ( exists $opt->{default} ? (default => $opt->{default}) : () ), - }, - ]; +sub _call_getopt { + my ( $class, %params ) = @_; - $name_to_init_arg{ $opt->{name} } = $opt->{init_arg}; - } + local @ARGV = @{ $params{argv} || \@ARGV }; + + my ( $opt_spec, $name_to_init_arg ) = $class->_gld_spec(%params); # Get a clean copy of the original @ARGV my $argv_copy = [ @ARGV ]; @@ -68,7 +67,7 @@ sub _parse_argv { my ( $parsed_options, $usage ) = eval { local $SIG{__WARN__} = sub { push @err, @_ }; - Getopt::Long::Descriptive::describe_options("usage: %c %o", @options) + Getopt::Long::Descriptive::describe_options("usage: %c %o", @$opt_spec) }; die join "", grep { defined } @err, $@ if @err or $@; @@ -76,15 +75,34 @@ sub _parse_argv { # Get a copy of the Getopt::Long-mangled @ARGV my $argv_mangled = [ @ARGV ]; - return ( - argv_copy => $argv_copy, - argv => $argv_mangled, - params => { - map { - $name_to_init_arg{$_} => $parsed_options->{$_} - } keys %$parsed_options, - } + my %constructor_args = ( + map { + $name_to_init_arg->{$_} => $parsed_options->{$_} + } keys %$parsed_options, ); + + return ( \%constructor_args, $argv_copy, $argv_mangled ); +} + +sub _gld_spec { + my ( $class, %params ) = @_; + + my ( @options, %name_to_init_arg ); + + 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}) : () ), + }, + ]; + + $name_to_init_arg{ $opt->{name} } = $opt->{init_arg}; + } + + return ( \@options, \%name_to_init_arg ); } sub _compute_getopt_attrs {