File Coverage

blib/lib/MouseX/Getopt/OptionTypeMap.pm
Criterion Covered Total %
statement 31 34 91.1
branch 16 26 61.5
condition 1 3 33.3
subroutine 7 7 100.0
pod 3 3 100.0
total 58 73 79.4


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