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