| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package MouseX::Getopt::OptionTypeMap; | 
| 2 |  |  |  |  |  |  | # ABSTRACT: Storage for the option to type mappings | 
| 3 |  |  |  |  |  |  |  | 
| 4 | 22 |  |  | 22 |  | 156 | use Mouse 'confess', 'blessed'; | 
|  | 22 |  |  |  |  | 59 |  | 
|  | 22 |  |  |  |  | 136 |  | 
| 5 | 22 |  |  | 22 |  | 9690 | use Mouse::Util::TypeConstraints 'find_type_constraint'; | 
|  | 22 |  |  |  |  | 52 |  | 
|  | 22 |  |  |  |  | 161 |  | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | my %option_type_map = ( | 
| 8 |  |  |  |  |  |  | 'Bool'     => '!', | 
| 9 |  |  |  |  |  |  | 'Str'      => '=s', | 
| 10 |  |  |  |  |  |  | 'Int'      => '=i', | 
| 11 |  |  |  |  |  |  | 'Num'      => '=f', | 
| 12 |  |  |  |  |  |  | 'ArrayRef' => '=s@', | 
| 13 |  |  |  |  |  |  | 'HashRef'  => '=s%', | 
| 14 |  |  |  |  |  |  | ); | 
| 15 |  |  |  |  |  |  |  | 
| 16 |  |  |  |  |  |  | sub has_option_type { | 
| 17 | 545 |  |  | 545 | 1 | 1008 | my (undef, $type_or_name) = @_; | 
| 18 |  |  |  |  |  |  |  | 
| 19 | 545 | 50 |  |  |  | 2956 | return 1 if exists $option_type_map{blessed($type_or_name) ? $type_or_name->name : $type_or_name}; | 
|  |  | 100 |  |  |  |  |  | 
| 20 |  |  |  |  |  |  |  | 
| 21 | 2 | 50 |  |  |  | 8 | my $current = blessed($type_or_name) ? $type_or_name : find_type_constraint($type_or_name); | 
| 22 |  |  |  |  |  |  |  | 
| 23 | 2 | 50 |  |  |  | 6 | (defined $current) | 
| 24 |  |  |  |  |  |  | || confess "Could not find the type constraint for '$type_or_name'"; | 
| 25 |  |  |  |  |  |  |  | 
| 26 | 2 |  |  |  |  | 13 | while (my $parent = $current->parent) { | 
| 27 | 2 | 50 |  |  |  | 10 | return 1 if exists $option_type_map{$parent->name}; | 
| 28 | 0 |  |  |  |  | 0 | $current = $parent; | 
| 29 |  |  |  |  |  |  | } | 
| 30 |  |  |  |  |  |  |  | 
| 31 | 0 |  |  |  |  | 0 | return 0; | 
| 32 |  |  |  |  |  |  | } | 
| 33 |  |  |  |  |  |  |  | 
| 34 |  |  |  |  |  |  | sub get_option_type { | 
| 35 | 545 |  |  | 545 | 1 | 946 | my (undef, $type_or_name) = @_; | 
| 36 |  |  |  |  |  |  |  | 
| 37 | 545 | 50 |  |  |  | 1563 | my $name = blessed($type_or_name) ? $type_or_name->name : $type_or_name; | 
| 38 |  |  |  |  |  |  |  | 
| 39 | 545 | 100 |  |  |  | 1888 | return $option_type_map{$name} if exists $option_type_map{$name}; | 
| 40 |  |  |  |  |  |  |  | 
| 41 | 2 | 50 |  |  |  | 14 | my $current = ref $type_or_name ? $type_or_name : find_type_constraint($type_or_name); | 
| 42 |  |  |  |  |  |  |  | 
| 43 | 2 | 50 |  |  |  | 7 | (defined $current) | 
| 44 |  |  |  |  |  |  | || confess "Could not find the type constraint for '$type_or_name'"; | 
| 45 |  |  |  |  |  |  |  | 
| 46 | 2 |  |  |  |  | 9 | while ( $current = $current->parent ) { | 
| 47 |  |  |  |  |  |  | return $option_type_map{$current->name} | 
| 48 | 2 | 50 |  |  |  | 19 | if exists $option_type_map{$current->name}; | 
| 49 |  |  |  |  |  |  | } | 
| 50 |  |  |  |  |  |  |  | 
| 51 | 0 |  |  |  |  | 0 | return; | 
| 52 |  |  |  |  |  |  | } | 
| 53 |  |  |  |  |  |  |  | 
| 54 |  |  |  |  |  |  | sub add_option_type_to_map { | 
| 55 | 9 |  |  | 9 | 1 | 1430 | my (undef, $type_name, $option_string) = @_; | 
| 56 | 9 | 50 | 33 |  |  | 47 | (defined $type_name && defined $option_string) | 
| 57 |  |  |  |  |  |  | || confess "You must supply both a type name and an option string"; | 
| 58 |  |  |  |  |  |  |  | 
| 59 | 9 | 100 |  |  |  | 42 | if ( blessed($type_name) ) { | 
| 60 | 4 |  |  |  |  | 17 | $type_name = $type_name->name; | 
| 61 |  |  |  |  |  |  | } else { | 
| 62 | 5 | 50 |  |  |  | 19 | (find_type_constraint($type_name)) | 
| 63 |  |  |  |  |  |  | || confess "The type constraint '$type_name' does not exist"; | 
| 64 |  |  |  |  |  |  | } | 
| 65 |  |  |  |  |  |  |  | 
| 66 | 9 |  |  |  |  | 107 | $option_type_map{$type_name} = $option_string; | 
| 67 |  |  |  |  |  |  | } | 
| 68 |  |  |  |  |  |  |  | 
| 69 | 22 |  |  | 22 |  | 10755 | no Mouse::Util::TypeConstraints; | 
|  | 22 |  |  |  |  | 57 |  | 
|  | 22 |  |  |  |  | 135 |  | 
| 70 | 22 |  |  | 22 |  | 2231 | no Mouse; | 
|  | 22 |  |  |  |  | 67 |  | 
|  | 22 |  |  |  |  | 205 |  | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | 1; | 
| 73 |  |  |  |  |  |  |  | 
| 74 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 75 |  |  |  |  |  |  |  | 
| 76 |  |  |  |  |  |  | See the I section in the L docs | 
| 77 |  |  |  |  |  |  | for more info about how to use this module. | 
| 78 |  |  |  |  |  |  |  | 
| 79 |  |  |  |  |  |  | =over 4 | 
| 80 |  |  |  |  |  |  |  | 
| 81 |  |  |  |  |  |  | =item B | 
| 82 |  |  |  |  |  |  |  | 
| 83 |  |  |  |  |  |  | =item B | 
| 84 |  |  |  |  |  |  |  | 
| 85 |  |  |  |  |  |  | =item B | 
| 86 |  |  |  |  |  |  |  | 
| 87 |  |  |  |  |  |  | =back | 
| 88 |  |  |  |  |  |  |  | 
| 89 |  |  |  |  |  |  | =cut |