X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FGetopt%2FOptionTypeMap.pm;h=4102c75f8489ee27de3c0d0d1c128dabbf9dfda3;hb=bde911ddcfdec86961080d6292ff414753671793;hp=651bf1598282026aad15bbceb6d464543eab6d01;hpb=7ff9f8b5e03f470cef8d8e630a92d7a18784a1a1;p=gitmo%2FMooseX-Getopt.git diff --git a/lib/MooseX/Getopt/OptionTypeMap.pm b/lib/MooseX/Getopt/OptionTypeMap.pm index 651bf15..4102c75 100644 --- a/lib/MooseX/Getopt/OptionTypeMap.pm +++ b/lib/MooseX/Getopt/OptionTypeMap.pm @@ -1,31 +1,37 @@ - package MooseX::Getopt::OptionTypeMap; +# ABSTRACT: Storage for the option to type mappings use Moose 'confess', 'blessed'; use Moose::Util::TypeConstraints 'find_type_constraint'; -our $VERSION = '0.19'; -our $AUTHORITY = 'cpan:STEVAN'; - my %option_type_map = ( 'Bool' => '!', 'Str' => '=s', 'Int' => '=i', 'Num' => '=f', 'ArrayRef' => '=s@', - 'HashRef' => '=s%', + 'HashRef' => '=s%', ); sub has_option_type { my (undef, $type_or_name) = @_; + if (blessed($type_or_name) + && $type_or_name->isa('Moose::Meta::TypeConstraint::Union')) { + foreach my $union_type (@{$type_or_name->type_constraints}) { + return 1 + if __PACKAGE__->has_option_type($union_type); + } + return 0; + } + return 1 if exists $option_type_map{blessed($type_or_name) ? $type_or_name->name : $type_or_name}; my $current = blessed($type_or_name) ? $type_or_name : find_type_constraint($type_or_name); - + (defined $current) || confess "Could not find the type constraint for '$type_or_name'"; - + while (my $parent = $current->parent) { return 1 if exists $option_type_map{$parent->name}; $current = $parent; @@ -37,14 +43,24 @@ sub has_option_type { sub get_option_type { my (undef, $type_or_name) = @_; + if (blessed($type_or_name) + && $type_or_name->isa('Moose::Meta::TypeConstraint::Union')) { + foreach my $union_type (@{$type_or_name->type_constraints}) { + my $option_type = __PACKAGE__->get_option_type($union_type); + return $option_type + if defined $option_type; + } + return; + } + my $name = blessed($type_or_name) ? $type_or_name->name : $type_or_name; return $option_type_map{$name} if exists $option_type_map{$name}; my $current = ref $type_or_name ? $type_or_name : find_type_constraint($type_or_name); - + (defined $current) - || confess "Could not find the type constraint for '$type_or_name'"; + || confess "Could not find the type constraint for '$type_or_name'"; while ( $current = $current->parent ) { return $option_type_map{$current->name} @@ -69,55 +85,20 @@ sub add_option_type_to_map { $option_type_map{$type_name} = $option_string; } -no Moose; no Moose::Util::TypeConstraints; 1; - -__END__ - - -=pod - -=head1 NAME +no Moose::Util::TypeConstraints; +no Moose; -MooseX::Getopt::OptionTypeMap - Storage for the option to type mappings +1; =head1 DESCRIPTION See the I section in the L docs for more info about how to use this module. -=head1 METHODS - -These are all class methods and should be called as such. - -=over 4 - -=item B - -=item B - -=item B - -=item B - -=back - -=head1 BUGS - -All complex software has bugs lurking in it, and this module is no -exception. If you find a bug please either email me, or add the bug -to cpan-RT. - -=head1 AUTHOR - -Stevan Little Estevan@iinteractive.comE - -=head1 COPYRIGHT AND LICENSE - -Copyright 2007-2008 by Infinity Interactive, Inc. +=method B -L +=method B -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. +=method B =cut