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   129 use strict;
  26         51  
  26         823  
2 26     26   129 use warnings;
  26         50  
  26         892  
3             # ABSTRACT: a tolerance "m (-l or +n)"
4              
5             package
6             Number::Tolerant::Type::offset;
7 26     26   123 use parent qw(Number::Tolerant::Type);
  26         46  
  26         138  
8              
9 3     3 1 6 sub construct { shift;
10             {
11 3         16 value => $_[0],
12             min => $_[0] + $_[1],
13             max => $_[0] + $_[2]
14             }
15             }
16              
17             sub parse {
18 17     17 1 40 my ($self, $string, $factory) = @_;
19              
20 17         116 my $number = $self->number_re;
21 17 100       921 return $factory->new("$1", 'offset', "$2", "$3")
22             if $string =~ m!\A($number)\s+\(?\s*($number)\s+($number)\s*\)?\s*\z!;
23              
24 16         114 return;
25             }
26              
27             sub stringify {
28 7     7 1 2373 my ($self) = @_;
29             return sprintf "%s (-%s +%s)",
30             $_[0]->{value},
31             ($_[0]->{value} - $_[0]->{min}),
32 7         84 ($_[0]->{max} - $_[0]->{value});
33             }
34              
35             sub valid_args {
36 72     72 1 117 my $self = shift;
37              
38 72 50       229 return if @_ > 4;
39              
40 72 100       332 return unless defined(my $lhs_number = $self->normalize_number($_[0]));
41 55 100       388 return unless defined(my $minus_number = $self->normalize_number($_[2]));
42 24 100       405 return unless defined(my $plus_number = $self->normalize_number($_[3]));
43              
44 3 50       12 return unless $_[1] eq 'offset';
45 3 50       12 return unless $minus_number <= 0;
46 3 50       9 return unless $plus_number >= 0;
47              
48 3         47 return ($lhs_number, $minus_number, $plus_number)
49             }
50              
51             1;
52              
53             __END__