File Coverage

blib/lib/Number/Tolerant/Type/plus_or_minus_pct.pm
Criterion Covered Total %
statement 23 23 100.0
branch 9 10 90.0
condition n/a
subroutine 7 7 100.0
pod 4 4 100.0
total 43 44 97.7


line stmt bran cond sub pod time code
1 25     25   162 use strict;
  25         52  
  25         1298  
2 25     25   168 use warnings;
  25         58  
  25         2770  
3             # ABSTRACT: a tolerance "m +/- n%"
4              
5             package
6             Number::Tolerant::Type::plus_or_minus_pct;
7 25     25   143 use parent qw(Number::Tolerant::Type);
  25         92  
  25         211  
8              
9 5     5 1 10 sub construct { shift;
10             {
11 5         37 value => $_[0],
12             variance => $_[1],
13             min => $_[0] - $_[0]*($_[1]/100),
14             max => $_[0] + $_[0]*($_[1]/100)
15             }
16             }
17              
18             sub parse {
19 23     23 1 96 my ($self, $string, $factory) = @_;
20 23         144 my $number = $self->number_re;
21              
22 23 100       1764 return $factory->new("$1", 'plus_or_minus_pct', "$2")
23             if $string =~ m!\A($number)\s*\+/-\s*($number)%\z!;
24 22         143 return;
25             }
26              
27 9     9 1 2617 sub stringify { "$_[0]->{value} +/- $_[0]->{variance}%" }
28              
29             sub valid_args {
30 106     106 1 186 my $self = shift;
31              
32 106 100       216 return unless 3 == grep { defined } @_;
  251         741  
33 42 100       247 return unless $_[1] eq 'plus_or_minus_pct';
34              
35 6 50       54 return unless defined (my $base = $self->normalize_number($_[0]));
36 6 100       20 return unless defined (my $var = $self->normalize_number($_[2]));
37              
38 5         104 return ($base, $var);
39             }
40              
41             1;
42              
43             __END__