File Coverage

blib/lib/Number/Tolerant/Type/offset.pm
Criterion Covered Total %
statement 26 26 100.0
branch 12 16 75.0
condition n/a
subroutine 7 7 100.0
pod 4 4 100.0
total 49 53 92.4


line stmt bran cond sub pod time code
1 26     26   145 use strict;
  26         49  
  26         737  
2 26     26   113 use warnings;
  26         53  
  26         758  
3             # ABSTRACT: a tolerance "m (-l or +n)"
4              
5             package
6             Number::Tolerant::Type::offset;
7 26     26   113 use parent qw(Number::Tolerant::Type);
  26         42  
  26         99  
8              
9 3     3 1 3 sub construct { shift;
10             {
11 3         25 value => $_[0],
12             min => $_[0] + $_[1],
13             max => $_[0] + $_[2]
14             }
15             }
16              
17             sub parse {
18 28     28 1 66 my ($self, $string, $factory) = @_;
19              
20 28         109 my $number = $self->number_re;
21 28 100       929 return $factory->new("$1", 'offset', "$2", "$3")
22             if $string =~ m!\A($number)\s+\(?\s*($number)\s+($number)\s*\)?\s*\z!;
23              
24 27         117 return;
25             }
26              
27             sub stringify {
28 7     7 1 3851 my ($self) = @_;
29             return sprintf "%s (-%s +%s)",
30             $_[0]->{value},
31             ($_[0]->{value} - $_[0]->{min}),
32 7         70 ($_[0]->{max} - $_[0]->{value});
33             }
34              
35             sub valid_args {
36 113     113 1 156 my $self = shift;
37              
38 113 50       239 return if @_ > 4;
39              
40 113 100       336 return unless defined(my $lhs_number = $self->normalize_number($_[0]));
41 85 100       245 return unless defined(my $minus_number = $self->normalize_number($_[2]));
42 30 100       91 return unless defined(my $plus_number = $self->normalize_number($_[3]));
43              
44 3 50       13 return unless $_[1] eq 'offset';
45 3 50       9 return unless $minus_number <= 0;
46 3 50       8 return unless $plus_number >= 0;
47              
48 3         14 return ($lhs_number, $minus_number, $plus_number)
49             }
50              
51             1;
52              
53             __END__