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 25     25   197 use strict;
  25         49  
  25         1199  
2 25     25   124 use warnings;
  25         70  
  25         1795  
3             # ABSTRACT: a tolerance "m (-l or +n)"
4              
5             package
6             Number::Tolerant::Type::offset;
7 25     25   200 use parent qw(Number::Tolerant::Type);
  25         78  
  25         167  
8              
9 2     2 1 5 sub construct { shift;
10             {
11 2         13 value => $_[0],
12             min => $_[0] + $_[1],
13             max => $_[0] + $_[2]
14             }
15             }
16              
17             sub parse {
18 24     24 1 78 my ($self, $string, $factory) = @_;
19              
20 24         118 my $number = $self->number_re;
21 24 100       3640 return $factory->new("$1", 'offset', "$2", "$3")
22             if $string =~ m!\A($number)\s+\(?\s*($number)\s+($number)\s*\)?\s*\z!;
23              
24 23         168 return;
25             }
26              
27             sub stringify {
28 2     2 1 1873 my ($self) = @_;
29             return sprintf "%s (-%s +%s)",
30             $_[0]->{value},
31             ($_[0]->{value} - $_[0]->{min}),
32 2         25 ($_[0]->{max} - $_[0]->{value});
33             }
34              
35             sub valid_args {
36 92     92 1 167 my $self = shift;
37              
38 92 50       273 return if @_ > 4;
39              
40 92 100       489 return unless defined(my $lhs_number = $self->normalize_number($_[0]));
41 67 100       239 return unless defined(my $minus_number = $self->normalize_number($_[2]));
42 31 100       412 return unless defined(my $plus_number = $self->normalize_number($_[3]));
43              
44 2 50       7 return unless $_[1] eq 'offset';
45 2 50       8 return unless $minus_number <= 0;
46 2 50       6 return unless $plus_number >= 0;
47              
48 2         9 return ($lhs_number, $minus_number, $plus_number)
49             }
50              
51             1;
52              
53             __END__