* MooseX::Getopt::Session: Drop die_on_warning attribute.
Piotr Roszatycki [Wed, 12 Nov 2008 16:22:46 +0000 (16:22 +0000)]
* MooseX::Getopt::Parser::Descriptive: Unmagle field names in options hashref.
* t/00[1234]*.t: Test both of parsers.

ChangeLog
lib/MooseX/Getopt/Parser/Descriptive.pm
lib/MooseX/Getopt/Parser/Long.pm
lib/MooseX/Getopt/Session.pm
t/001_basic.t
t/002_custom_option_type.t
t/003_inferred_option_type.t
t/004_nogetop.t

index 5cf2dd7..75d2a43 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,7 +16,6 @@ Revision history for Perl extension MooseX-Getopt
             (dexter)
 
         * TODO:
-          - MooseX::Getopt::Parser::Descriptive is not implemeted yet.
           - MooseX::ConfigFromFile should be restored?
           - POD.
           - New test units.        
index 63e9744..ad547ba 100644 (file)
@@ -33,8 +33,9 @@ sub build_options {
     Moose->throw_error('First argument is not a MooseX::Getopt::Session')
         unless $getopt->isa('MooseX::Getopt::Session');
 
-    my ($options, $usage);
-    my @opts;
+    my $options = {};
+    my $usage;
+    my (@opts, %cmd_flags_to_names);
 
     foreach my $attr (@attrs) {
         my $name = $attr->name;
@@ -42,6 +43,8 @@ sub build_options {
         my ($flag, @aliases) = $getopt->_get_cmd_flags_for_attr($attr);
         my $type = $getopt->_get_cmd_type_for_attr($attr);
 
+       $cmd_flags_to_names{$flag} = $name;
+
         my $opt_string = join '|', $flag, @aliases;
         $opt_string .= MooseX::Getopt::OptionTypeMap->get_option_type($type);
 
@@ -83,15 +86,21 @@ sub build_options {
         $getopt->extra_argv( $extra_argv );
     };
 
+    # Convert cmd_flags back to names in options hashref
+    $options = {
+        map {
+            $cmd_flags_to_names{$_} => $options->{$_}
+        } keys %$options,
+    };
+
     #%options = map { $_ => $options{$_} } grep { defined $options{$_} } keys %options;
-    $getopt->options( defined $options ? $options : {} );
+    $getopt->options( $options );
 
     ### MooseX::Getopt::Parser::Descriptive::build_options $options : $options
     ### MooseX::Getopt::Parser::Descriptive::build_options $usage : $usage
     ### MooseX::Getopt::Parser::Descriptive::build_options $getopt->status : $getopt->status
 
-    die join '', $getopt->warning
-        if $getopt->die_on_warning && ($getopt->has_warning || !$getopt->status);
+    die join '', $getopt->warning if ($getopt->has_warning || !$getopt->status);
 
     return $options;
 };
index 70ad5a1..12f6565 100644 (file)
@@ -68,7 +68,7 @@ sub build_options {
     %options = map { $_ => $options{$_} } grep { defined $options{$_} } keys %options;
     $getopt->options( \%options );
 
-    die join '', $getopt->warning if $getopt->die_on_warning && $getopt->has_warning;
+    die join '', $getopt->warning if $getopt->has_warning;
 
     ### MooseX::Getopt::Parser::Long::build_options %options : %options
     return \%options;
index 0b10744..81f4b26 100644 (file)
@@ -9,7 +9,7 @@ use maybe 'MooseX::Getopt::Parser::Descriptive';
 #use Smart::Comments;
 
 # Pluggined MooseX::Getopt::Parser parser
-has 'getopt_parser' => (
+has 'parser' => (
     is => 'rw',
     does => 'MooseX::Getopt::Parser',
     default => sub {
@@ -64,13 +64,6 @@ has 'warning' => (
 );
 
 # Die if warnings was occured
-has 'die_on_warning' => (
-    is => 'rw',
-    isa => 'Bool',
-    default => 1,
-);
-
-
 sub BUILD {
     ### MooseX::Getopt::Session::BUILD : @_
     my ($self, $args) = @_;
@@ -85,7 +78,7 @@ sub build_options {
     my @attrs = map { $_->_compute_getopt_attrs } $self->_compute_getopt_classes;
     ### MooseX::Getopt::Session::build_options @attrs -> name : map { $_->name } @attrs
 
-    return $self->getopt_parser->build_options( $self, @attrs );
+    return $self->parser->build_options( $self, @attrs );
 }
 
 
index 6c1c1fa..3b171a1 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 69;
+use Test::More tests => 173;
 
 BEGIN {
     use_ok('MooseX::Getopt');
@@ -12,11 +12,11 @@ BEGIN {
 {
     package App;
     use Moose;
-    
+
     with 'MooseX::Getopt';
 
     has 'data' => (
-        metaclass => 'MooseX::Getopt::Meta::Attribute',        
+        metaclass => 'MooseX::Getopt::Meta::Attribute',
         is        => 'ro',
         isa       => 'Str',
         default   => 'file.dat',
@@ -24,7 +24,7 @@ BEGIN {
     );
 
     has 'cow' => (
-        metaclass   => 'Getopt',        
+        metaclass   => 'Getopt',
         is          => 'ro',
         isa         => 'Str',
         default     => 'moo',
@@ -32,7 +32,7 @@ BEGIN {
     );
 
     has 'horse' => (
-        metaclass   => 'MooseX::Getopt::Meta::Attribute',        
+        metaclass   => 'MooseX::Getopt::Meta::Attribute',
         is          => 'ro',
         isa         => 'Str',
         default     => 'bray',
@@ -48,15 +48,15 @@ BEGIN {
 
     has 'verbose' => (
         is     => 'ro',
-        isa    => 'Bool',       
+        isa    => 'Bool',
     );
-    
+
     has 'libs' => (
         is      => 'ro',
         isa     => 'ArrayRef',
         default => sub { [] },
-    ); 
-    
+    );
+
     has 'details' => (
         is      => 'ro',
         isa     => 'HashRef',
@@ -70,13 +70,13 @@ BEGIN {
     );
 
     has '_private_stuff_cmdline' => (
-        metaclass => 'MooseX::Getopt::Meta::Attribute',        
+        metaclass => 'MooseX::Getopt::Meta::Attribute',
         is        => 'ro',
         isa       => 'Int',
         default   => 832,
         cmd_flag  => 'p',
     );
-  
+
 }
 
 foreach my $attr_name (qw(data cow horse _private_stuff_cmdline)) {
@@ -84,141 +84,238 @@ foreach my $attr_name (qw(data cow horse _private_stuff_cmdline)) {
     isa_ok($attr, 'Moose::Meta::Attribute');
     isa_ok($attr, 'MooseX::Getopt::Meta::Attribute');
     can_ok($attr, 'cmd_flag');
-    can_ok($attr, 'cmd_aliases');    
+    can_ok($attr, 'cmd_aliases');
 }
 
-{
-    local @ARGV = ();
+foreach my $parser_name (qw(MooseX::Getopt::Parser::Long MooseX::Getopt::Parser::Descriptive)) {
+    SKIP: {
+        if ($parser_name eq 'MooseX::Getopt::Parser::Descriptive') {
+            eval { require Getopt::Long::Descriptive };
+            skip "Getopt::Long::Descriptive not installed", 78 if $@;
+        }
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
+        {
+            local @ARGV = ();
 
-    ok(!$app->verbose, '... verbosity is off as expected');
-    is($app->length, 24, '... length is 24 as expected');    
-    is($app->data, 'file.dat', '... data is file.dat as expected');        
-    is_deeply($app->libs, [], '... libs is [] as expected'); 
-    is_deeply($app->details, {}, '... details is {} as expected');           
-}
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
 
-{
-    local @ARGV = ('--verbose', '--length', 50);
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
 
-    ok($app->verbose, '... verbosity is turned on as expected');
-    is($app->length, 50, '... length is 50 as expected');    
-    is($app->data, 'file.dat', '... data is file.dat as expected'); 
-    is_deeply($app->libs, [], '... libs is [] as expected');  
-    is_deeply($app->details, {}, '... details is {} as expected');                            
-}
+            ok(!$app->verbose, '... verbosity is off as expected');
+            is($app->length, 24, '... length is 24 as expected');
+            is($app->data, 'file.dat', '... data is file.dat as expected');
+            is_deeply($app->libs, [], '... libs is [] as expected');
+            is_deeply($app->details, {}, '... details is {} as expected');
+        }
 
-{
-    local @ARGV = ('--verbose', '-f', 'foo.txt');
+        {
+            local @ARGV = ('--verbose', '--length', 50);
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
 
-    ok($app->verbose, '... verbosity is turned on as expected');
-    is($app->length, 24, '... length is 24 as expected');    
-    is($app->data, 'foo.txt', '... data is foo.txt as expected'); 
-    is_deeply($app->libs, [], '... libs is [] as expected');    
-    is_deeply($app->details, {}, '... details is {} as expected');                             
-}
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
 
-{
-    local @ARGV = ('--verbose', '--libs', 'libs/', '--libs', 'includes/lib');
-
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-
-    ok($app->verbose, '... verbosity is turned on as expected');
-    is($app->length, 24, '... length is 24 as expected');    
-    is($app->data, 'file.dat', '... data is foo.txt as expected'); 
-    is_deeply($app->libs, 
-    ['libs/', 'includes/lib'], 
-    '... libs is [libs/, includes/lib] as expected');   
-    is_deeply($app->details, {}, '... details is {} as expected');                              
-}
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
 
-{
-    local @ARGV = ('--details', 'os=mac', '--details', 'name=foo');
-
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-
-    ok(!$app->verbose, '... verbosity is turned on as expected');
-    is($app->length, 24, '... length is 24 as expected');    
-    is($app->data, 'file.dat', '... data is foo.txt as expected'); 
-    is_deeply($app->libs, [], '... libs is [] as expected');    
-    is_deeply($app->details, 
-    { os => 'mac', name => 'foo' }, 
-    '... details is { os => mac, name => foo } as expected');                              
-}
+            ok($app->verbose, '... verbosity is turned on as expected');
+            is($app->length, 50, '... length is 50 as expected');
+            is($app->data, 'file.dat', '... data is file.dat as expected');
+            is_deeply($app->libs, [], '... libs is [] as expected');
+            is_deeply($app->details, {}, '... details is {} as expected');
+        }
 
-{
-    # Test negation on booleans too ...
-    local @ARGV = ('--noverbose');
+        {
+            local @ARGV = ('--verbose', '-f', 'foo.txt');
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
 
-    ok(!$app->verbose, '... verbosity is turned off as expected');
-    is($app->length, 24, '... length is 24 as expected');    
-    is($app->data, 'file.dat', '... file is file.dat as expected');   
-    is_deeply($app->libs, [], '... libs is [] as expected');                
-    is_deeply($app->details, {}, '... details is {} as expected');               
-}
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
 
-# Test cmd_alias without cmd_flag
-{
-    local @ARGV = ('--cow', '42');
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is($app->cow, 42, 'cmd_alias, but not using it');
-}
-{
-    local @ARGV = ('--moocow', '88');
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is($app->cow, 88, 'cmd_alias, using long one');
-}
-{
-    local @ARGV = ('-c', '99');
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is($app->cow, 99, 'cmd_alias, using short one');
-}
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
 
-# Test cmd_alias + cmd_flag
-{
-    local @ARGV = ('--horsey', '123');
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is($app->horse, 123, 'cmd_alias+cmd_flag, using flag');
-}
-{
-    local @ARGV = ('-x', '321');
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is($app->horse, 321, 'cmd_alias+cmd_flag, using alias');
-}
+            ok($app->verbose, '... verbosity is turned on as expected');
+            is($app->length, 24, '... length is 24 as expected');
+            is($app->data, 'foo.txt', '... data is foo.txt as expected');
 
-# Test _foo + cmd_flag
-{
-    local @ARGV = ('-p', '666');
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is($app->_private_stuff_cmdline, 666, '_foo + cmd_flag');
-}
+            is_deeply($app->libs, [], '... libs is [] as expected');
+            is_deeply($app->details, {}, '... details is {} as expected');
+        }
 
-# Test ARGV support
-{
-    my @args = ('-p', 12345, '-c', 99, '-');
-    local @ARGV = @args;
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-    is_deeply($app->ARGV, \@args, 'ARGV accessor');
-    is_deeply(\@ARGV, \@args, '@ARGV unmangled');
-    is_deeply($app->extra_argv, ['-'], 'extra_argv accessor');
+        {
+            local @ARGV = ('--verbose', '--libs', 'libs/', '--libs', 'includes/lib');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+
+            ok($app->verbose, '... verbosity is turned on as expected');
+            is($app->length, 24, '... length is 24 as expected');
+            is($app->data, 'file.dat', '... data is foo.txt as expected');
+            is_deeply($app->libs,
+            ['libs/', 'includes/lib'],
+            '... libs is [libs/, includes/lib] as expected');
+            is_deeply($app->details, {}, '... details is {} as expected');
+        }
+
+        {
+            local @ARGV = ('--details', 'os=mac', '--details', 'name=foo');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+
+            ok(!$app->verbose, '... verbosity is turned on as expected');
+            is($app->length, 24, '... length is 24 as expected');
+            is($app->data, 'file.dat', '... data is foo.txt as expected');
+            is_deeply($app->libs, [], '... libs is [] as expected');
+            is_deeply($app->details,
+            { os => 'mac', name => 'foo' },
+            '... details is { os => mac, name => foo } as expected');
+        }
+
+        {
+            # Test negation on booleans too ...
+            local @ARGV = ('--noverbose');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+
+            ok(!$app->verbose, '... verbosity is turned off as expected');
+            is($app->length, 24, '... length is 24 as expected');
+            is($app->data, 'file.dat', '... file is file.dat as expected');
+            is_deeply($app->libs, [], '... libs is [] as expected');
+            is_deeply($app->details, {}, '... details is {} as expected');
+        }
+
+        # Test cmd_alias without cmd_flag
+        {
+            local @ARGV = ('--cow', '42');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is($app->cow, 42, 'cmd_alias, but not using it');
+        }
+        {
+            local @ARGV = ('--moocow', '88');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is($app->cow, 88, 'cmd_alias, using long one');
+        }
+        {
+            local @ARGV = ('-c', '99');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is($app->cow, 99, 'cmd_alias, using short one');
+        }
+
+        # Test cmd_alias + cmd_flag
+        {
+            local @ARGV = ('--horsey', '123');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is($app->horse, 123, 'cmd_alias+cmd_flag, using flag');
+        }
+        {
+            local @ARGV = ('-x', '321');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is($app->horse, 321, 'cmd_alias+cmd_flag, using alias');
+        }
+
+        # Test _foo + cmd_flag
+        {
+            local @ARGV = ('-p', '666');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is($app->_private_stuff_cmdline, 666, '_foo + cmd_flag');
+        }
+
+        # Test ARGV support
+        {
+            my @args = ('-p', 12345, '-c', 99, '-');
+
+            local @ARGV = @args;
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+            is_deeply($app->ARGV, \@args, 'ARGV accessor');
+            is_deeply(\@ARGV, \@args, '@ARGV unmangled');
+            is_deeply($app->extra_argv, ['-'], 'extra_argv accessor');
+        }
+
+    }
 }
index fc46250..3ccdc7e 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 6;
+use Test::More tests => 21;
 
 BEGIN {
     use_ok('MooseX::Getopt');
@@ -13,51 +13,79 @@ BEGIN {
     package App;
     use Moose;
     use Moose::Util::TypeConstraints;
-    
+
     use Scalar::Util 'looks_like_number';
-    
+
     with 'MooseX::Getopt';
 
     subtype 'ArrayOfInts'
         => as 'ArrayRef'
         => where { scalar (grep { looks_like_number($_) } @$_)  };
-    
+
     MooseX::Getopt::OptionTypeMap->add_option_type_to_map(
         'ArrayOfInts' => '=i@'
     );
-       
+
     has 'nums' => (
         is      => 'ro',
         isa     => 'ArrayOfInts',
         default => sub { [0] }
-    ); 
-  
+    );
+
 }
 
-{
-    local @ARGV = ();
+foreach my $parser_name (qw(MooseX::Getopt::Parser::Long MooseX::Getopt::Parser::Descriptive)) {
+    SKIP: {
+        if ($parser_name eq 'MooseX::Getopt::Parser::Descriptive') {
+            eval { require Getopt::Long::Descriptive };
+            skip "Getopt::Long::Descriptive not installed", 10 if $@;
+        }
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-        
-    is_deeply($app->nums, [0], '... nums is [0] as expected');       
-}
+        {
+            local @ARGV = ();
 
-{
-    local @ARGV = ('--nums', 3, '--nums', 5);
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-        
-    is_deeply($app->nums, [3, 5], '... nums is [3, 5] as expected');       
-}
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
 
-# Make sure it really used our =i@, instead of falling back
-#  to =s@ via the type system, and test that exceptions work
-#  while we're at it.
-eval {
-    local @ARGV = ('--nums', 3, '--nums', 'foo');
+            is_deeply($app->nums, [0], '... nums is [0] as expected');
+        }
 
-    my $app = App->new_with_options;
-};
-like($@, qr/Value "foo" invalid/, 'Numeric constraint enforced');
+        {
+            local @ARGV = ('--nums', 3, '--nums', 5);
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+
+            is_deeply($app->nums, [3, 5], '... nums is [3, 5] as expected');
+        }
+
+        # Make sure it really used our =i@, instead of falling back
+        #  to =s@ via the type system, and test that exceptions work
+        #  while we're at it.
+        eval {
+            local @ARGV = ('--nums', 3, '--nums', 'foo');
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+        };
+        like($@, qr/Value "foo" invalid/, 'Numeric constraint enforced');
+
+    }
+}
index 5624867..4581bc8 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 5;
+use Test::More tests => 17;
 
 BEGIN {
     use_ok('MooseX::Getopt');
@@ -13,38 +13,59 @@ BEGIN {
     package App;
     use Moose;
     use Moose::Util::TypeConstraints;
-    
+
     use Scalar::Util 'looks_like_number';
-    
+
     with 'MooseX::Getopt';
 
     subtype 'ArrayOfInts'
         => as 'ArrayRef'
         => where { scalar (grep { looks_like_number($_) } @$_)  };
-    
+
     has 'nums' => (
         is      => 'ro',
         isa     => 'ArrayOfInts',
         default => sub { [0] }
-    ); 
-  
+    );
+
 }
 
-{
-    local @ARGV = ();
+foreach my $parser_name (qw(MooseX::Getopt::Parser::Long MooseX::Getopt::Parser::Descriptive)) {
+    SKIP: {
+        if ($parser_name eq 'MooseX::Getopt::Parser::Descriptive') {
+            eval { require Getopt::Long::Descriptive };
+            skip "Getopt::Long::Descriptive not installed", 8 if $@;
+        }
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-        
-    is_deeply($app->nums, [0], '... nums is [0] as expected');       
-}
+        {
+            local @ARGV = ();
 
-{
-    local @ARGV = ('--nums', 3, '--nums', 5);
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
 
-    my $app = App->new_with_options;
-    isa_ok($app, 'App');
-        
-    is_deeply($app->nums, [3, 5], '... nums is [3, 5] as expected');       
-}
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
 
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+
+            is_deeply($app->nums, [0], '... nums is [0] as expected');
+        }
+
+        {
+            local @ARGV = ('--nums', 3, '--nums', 5);
+
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
+
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok($app, 'App');
+
+            is_deeply($app->nums, [3, 5], '... nums is [3, 5] as expected');
+        }
+
+    }
+}
index 78da66d..c26006d 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 9;
+use Test::More tests => 23;
 use Test::Exception;
 
 BEGIN {
@@ -81,22 +81,48 @@ BEGIN {
 
 }
 
-{
-    local @ARGV = ();
+foreach my $parser_name (qw(MooseX::Getopt::Parser::Long MooseX::Getopt::Parser::Descriptive)) {
+    SKIP: {
+        if ($parser_name eq 'MooseX::Getopt::Parser::Descriptive') {
+            eval { require Getopt::Long::Descriptive };
+            skip "Getopt::Long::Descriptive not installed", 11 if $@;
+        }
 
-    my $app = App->new_with_options;
-    isa_ok( $app, 'App' );
+        {
+            local @ARGV = ();
 
-    ok( !$app->verbose, '... verbosity is off as expected' );
-    is( $app->length, 24,         '... length is 24 as expected' );
-    is( $app->data,   'file.dat', '... data is file.dat as expected' );
-    is_deeply( $app->libs, [], '... libs is [] as expected' );
-    is_deeply( $app->details, {}, '... details is {} as expected' );
-    is($app->private_stuff, 713, '... private stuff is 713 as expected');
-}
+            my $parser = $parser_name->new;
+            isa_ok($parser, $parser_name);
 
-{
-    local @ARGV = (qw/--private_stuff 317/);
+            my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+            isa_ok($getopt, 'MooseX::Getopt::Session');
+
+            my $app = App->new_with_options( getopt => $getopt );
+            isa_ok( $app, 'App' );
+
+            ok( !$app->verbose, '... verbosity is off as expected' );
+            is( $app->length, 24,         '... length is 24 as expected' );
+            is( $app->data,   'file.dat', '... data is file.dat as expected' );
+            is_deeply( $app->libs, [], '... libs is [] as expected' );
+            is_deeply( $app->details, {}, '... details is {} as expected' );
+            is($app->private_stuff, 713, '... private stuff is 713 as expected');
+        }
+
+        {
+            local @ARGV = (qw/--private_stuff 317/);
+
+            throws_ok {
+
+                my $parser = $parser_name->new;
+                isa_ok($parser, $parser_name);
+
+                my $getopt = MooseX::Getopt::Session->new( parser => $parser );
+                isa_ok($getopt, 'MooseX::Getopt::Session');
+
+                App->new_with_options( getopt => $getopt )
+
+            } qr/Unknown option: private_stuff/;
+        }
 
-    throws_ok { App->new_with_options } qr/Unknown option: private_stuff/;
+    }
 }