File Coverage

blib/lib/App/CmdDispatch/Table.pm
Criterion Covered Total %
statement 62 62 100.0
branch 26 26 100.0
condition 5 5 100.0
subroutine 12 12 100.0
pod 7 7 100.0
total 112 112 100.0


line stmt bran cond sub pod time code
1             package App::CmdDispatch::Table;
2              
3 14     14   104029 use warnings;
  14         25  
  14         392  
4 14     14   63 use strict;
  14         24  
  14         361  
5 14     14   7929 use App::CmdDispatch::Exception;
  14         34  
  14         11265  
6              
7             our $VERSION = '0.42';
8              
9             sub new
10             {
11 62     62 1 11015 my ( $class, $commands, $aliases ) = @_;
12 62   100     227 $aliases ||= {};
13 62 100       230 die "Command definition is not a hashref.\n" unless ref $commands eq ref {};
14 60 100       208 die "No commands specified.\n" unless keys %{$commands};
  60         210  
15 59 100       188 die "Aliases definition is not a hashref.\n" unless ref $aliases eq ref {};
16              
17 58         305 my $self = bless {
18             cmds => {},
19             alias => {},
20             }, $class;
21              
22 58         182 $self->_ensure_valid_command_description( $commands );
23 52         138 $self->_ensure_valid_aliases( $aliases );
24              
25 50         137 return $self;
26             }
27              
28             sub run
29             {
30 54     54 1 273 my ( $self, $base, $cmd, @args ) = @_;
31              
32 54 100 100     353 die App::CmdDispatch::Exception::MissingCommand->new if !defined $cmd || $cmd eq '';
33              
34             # Handle alias if one is supplied
35 49 100       143 if( exists $self->{alias}->{$cmd} )
36             {
37 2         11 ( $cmd, @args ) = ( ( split / /, $self->{alias}->{$cmd} ), @args );
38             }
39              
40             # Handle builtin commands
41 49 100       164 die App::CmdDispatch::Exception::UnknownCommand->new( $cmd ) unless $self->{cmds}->{$cmd};
42 47         185 $self->{cmds}->{$cmd}->{'code'}->( $base, @args );
43              
44 47         134 return;
45             }
46              
47             sub _ensure_valid_command_description
48             {
49 58     58   86 my ( $self, $cmds ) = @_;
50 58         85 while ( my ( $key, $val ) = each %{$cmds} )
  182         583  
51             {
52 130 100       291 next if $key eq '';
53 129 100       294 if( !defined $val )
54             {
55 1         3 delete $self->{cmds}->{$key};
56 1         3 next;
57             }
58 128 100       974 die "Command '$key' is an invalid descriptor.\n" unless ref $val eq ref {};
59 126 100       399 die "Command '$key' has no handler.\n" unless ref $val->{code} eq 'CODE';
60              
61 122         724 my $desc = { %{$val} };
  122         497  
62 122         603 $self->{cmds}->{$key} = $desc;
63             }
64              
65 52         88 return;
66             }
67              
68             sub _ensure_valid_aliases
69             {
70 52     52   95 my ( $self, $aliases ) = @_;
71 52         71 while ( my ( $key, $val ) = each %{$aliases} )
  73         260  
72             {
73 23 100       75 next if $key eq '';
74 22 100       52 if( !defined $val )
75             {
76 1         2 delete $self->{alias}->{$key};
77 1         3 next;
78             }
79 21 100       88 die "Alias '$key' mapping is not a string.\n" if ref $val;
80 19         65 $self->{alias}->{$key} = $val;
81             }
82              
83 50         80 return;
84             }
85              
86             sub command_list
87             {
88 97     97 1 4135 my ($self) = @_;
89 97         125 return sort keys %{$self->{cmds}}; ## no critic - intended to return list
  97         705  
90             }
91              
92             sub alias_list
93             {
94 16     16 1 28 my ($self) = @_;
95 16         24 return sort keys %{$self->{alias}}; ## no critic - intended to return list
  16         781  
96             }
97              
98             sub get_command
99             {
100 506     506 1 724 my ($self, $cmd) = @_;
101 506         1763 return $self->{cmds}->{$cmd};
102             }
103              
104             sub get_alias
105             {
106 34     34 1 55 my ($self, $alias) = @_;
107 34         204 return $self->{alias}->{$alias};
108             }
109              
110             sub has_aliases
111             {
112 39     39 1 60 my ($self) = @_;
113 39         120 return 0 != keys %{ $self->{alias} };
  39         213  
114             }
115              
116             1;
117             __END__