File Coverage

blib/lib/Enum/Declare/Meta.pm
Criterion Covered Total %
statement 44 44 100.0
branch 10 10 100.0
condition 3 3 100.0
subroutine 11 11 100.0
pod 0 6 0.0
total 68 74 91.8


line stmt bran cond sub pod time code
1             package Enum::Declare::Meta;
2              
3 11     11   53 use strict;
  11         14  
  11         395  
4 11     11   40 use warnings;
  11         21  
  11         577  
5 11     11   72 use Carp qw/croak/;
  11         14  
  11         590  
6 11     11   44 use Object::Proto;
  11         15  
  11         763  
7              
8             BEGIN {
9 11     11   5722 object 'Enum::Declare::Meta',
10             'enum_name:Str:required',
11             'package:Str:required',
12             'names:ArrayRef:required',
13             'values:ArrayRef:required',
14             'name2val:HashRef:required',
15             'val2name:HashRef:required';
16             }
17              
18             sub name {
19 6     6 0 13 my ($self, $val) = @_;
20 6         37 return $self->val2name->{$val};
21             }
22              
23             sub value {
24 10     10 0 195 my ($self, $name) = @_;
25 10         62 return $self->name2val->{$name};
26             }
27              
28             sub valid {
29 6     6 0 12 my ($self, $val) = @_;
30 6 100       32 return exists $self->val2name->{$val} ? 1 : 0;
31             }
32              
33             sub pairs {
34 1     1 0 2 my ($self) = @_;
35 1         2 my @names = @{ $self->names };
  1         5  
36 1         6 my @values = @{ $self->values };
  1         4  
37 1         3 return map { $names[$_] => $values[$_] } 0 .. $#names;
  3         31  
38             }
39              
40             sub count {
41 68     68 0 577876 my ($self) = @_;
42 68         89 return scalar @{ $self->names };
  68         199  
43             }
44              
45             sub match {
46 11     11 0 174137 my ($self, $val, $handlers) = @_;
47 11         17 my @names = @{ $self->names };
  11         51  
48 11         19 my $has_default = exists $handlers->{'_'};
49              
50 11 100       27 unless ($has_default) {
51 8         18 my @missing = grep { !exists $handlers->{$_} } @names;
  24         45  
52 8 100       24 if (@missing) {
53 2         336 croak("Non exhaustive match for " . $self->enum_name
54             . ": missing " . join(', ', @missing));
55             }
56             }
57              
58 9         26 my $variant = $self->val2name->{$val};
59 9 100 100     40 if (defined $variant && exists $handlers->{$variant}) {
60 6         16 return $handlers->{$variant}->($val);
61             }
62 3 100       9 if ($has_default) {
63 2         9 return $handlers->{'_'}->($val);
64             }
65 1         103 croak("No match for value '$val' in " . $self->enum_name);
66             }
67              
68             1;