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 7     7   32 use strict;
  7         9  
  7         253  
4 7     7   35 use warnings;
  7         7  
  7         334  
5 7     7   31 use Carp qw/croak/;
  7         9  
  7         396  
6 7     7   29 use Object::Proto;
  7         8  
  7         454  
7              
8             BEGIN {
9 7     7   3494 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         39 return $self->val2name->{$val};
21             }
22              
23             sub value {
24 5     5 0 20 my ($self, $name) = @_;
25 5         24 return $self->name2val->{$name};
26             }
27              
28             sub valid {
29 6     6 0 20 my ($self, $val) = @_;
30 6 100       35 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         4  
36 1         1 my @values = @{ $self->values };
  1         2  
37 1         4 return map { $names[$_] => $values[$_] } 0 .. $#names;
  3         13  
38             }
39              
40             sub count {
41 6     6 0 603864 my ($self) = @_;
42 6         11 return scalar @{ $self->names };
  6         39  
43             }
44              
45             sub match {
46 11     11 0 162285 my ($self, $val, $handlers) = @_;
47 11         16 my @names = @{ $self->names };
  11         45  
48 11         20 my $has_default = exists $handlers->{'_'};
49              
50 11 100       31 unless ($has_default) {
51 8         14 my @missing = grep { !exists $handlers->{$_} } @names;
  24         39  
52 8 100       15 if (@missing) {
53 2         305 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     36 if (defined $variant && exists $handlers->{$variant}) {
60 6         12 return $handlers->{$variant}->($val);
61             }
62 3 100       7 if ($has_default) {
63 2         8 return $handlers->{'_'}->($val);
64             }
65 1         124 croak("No match for value '$val' in " . $self->enum_name);
66             }
67              
68             1;