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   63 use strict;
  11         20  
  11         439  
4 11     11   47 use warnings;
  11         16  
  11         770  
5 11     11   80 use Carp qw/croak/;
  11         41  
  11         746  
6 11     11   55 use Object::Proto;
  11         17  
  11         936  
7              
8             BEGIN {
9 11     11   6971 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 15 my ($self, $val) = @_;
20 6         36 return $self->val2name->{$val};
21             }
22              
23             sub value {
24 10     10 0 330 my ($self, $name) = @_;
25 10         83 return $self->name2val->{$name};
26             }
27              
28             sub valid {
29 6     6 0 11 my ($self, $val) = @_;
30 6 100       39 return exists $self->val2name->{$val} ? 1 : 0;
31             }
32              
33             sub pairs {
34 1     1 0 2 my ($self) = @_;
35 1         3 my @names = @{ $self->names };
  1         5  
36 1         2 my @values = @{ $self->values };
  1         2  
37 1         3 return map { $names[$_] => $values[$_] } 0 .. $#names;
  3         12  
38             }
39              
40             sub count {
41 68     68 0 582614 my ($self) = @_;
42 68         96 return scalar @{ $self->names };
  68         235  
43             }
44              
45             sub match {
46 11     11 0 176021 my ($self, $val, $handlers) = @_;
47 11         20 my @names = @{ $self->names };
  11         51  
48 11         16 my $has_default = exists $handlers->{'_'};
49              
50 11 100       35 unless ($has_default) {
51 8         10 my @missing = grep { !exists $handlers->{$_} } @names;
  24         39  
52 8 100       17 if (@missing) {
53 2         275 croak("Non exhaustive match for " . $self->enum_name
54             . ": missing " . join(', ', @missing));
55             }
56             }
57              
58 9         29 my $variant = $self->val2name->{$val};
59 9 100 100     56 if (defined $variant && exists $handlers->{$variant}) {
60 6         20 return $handlers->{$variant}->($val);
61             }
62 3 100       6 if ($has_default) {
63 2         4 return $handlers->{'_'}->($val);
64             }
65 1         140 croak("No match for value '$val' in " . $self->enum_name);
66             }
67              
68             1;