File Coverage

blib/lib/Number/ZipCode/JP.pm
Criterion Covered Total %
statement 64 73 87.6
branch 12 20 60.0
condition 5 11 45.4
subroutine 13 13 100.0
pod 3 3 100.0
total 97 120 80.8


line stmt bran cond sub pod time code
1             package Number::ZipCode::JP;
2              
3 4     4   2460785 use strict;
  4         8  
  4         199  
4 4     4   36 use warnings;
  4         7  
  4         281  
5 4     4   84 use 5.008_001;
  4         13  
6 4     4   13 use Carp;
  4         10  
  4         321  
7 4     4   1853 use UNIVERSAL::require;
  4         4172  
  4         683  
8              
9             our $VERSION = '0.20260630';
10             our %ZIP_TABLE = ();
11              
12             sub import {
13 5     5   696 my $self = shift;
14 5         56 %ZIP_TABLE = ();
15 5 100       19 if (@_) {
16 2         4 my @packages = ();
17 2         4 for my $subclass (@_) {
18 2         8 push @packages,
19             sprintf('%s::Table::%s', __PACKAGE__, ucfirst(lc($subclass)));
20             }
21 2         9 %ZIP_TABLE = _merge_table(@packages);
22             }
23             else {
24 3         834 require Number::ZipCode::JP::Table;
25 3         14 import Number::ZipCode::JP::Table;
26             }
27 5         1456 return $self;
28             }
29              
30             sub _merge_table {
31 4     4   8 my %table = ();
32 4         8 for my $pkg (@_) {
33 6 50       36 $pkg->require or croak $@;
34             {
35 4     4   23 no strict 'refs';
  4         8  
  4         1967  
  6         90  
36 6         142 while (my($k, $v) = each %{"$pkg\::ZIP_TABLE"}) {
  5691         11707  
37 5685   100     11611 $table{$k} ||= [];
38 5685         4962 push @{$table{$k}}, $v;
  5685         7494  
39             }
40             }
41             }
42 4         1414 return %table;
43             }
44              
45             sub new {
46 3     3 1 138159 my $class = shift;
47 3         9 my $self = bless {}, $class;
48 3 50       11 $self->set_number(@_) if @_;
49 3         32 return $self;
50             }
51              
52             sub set_number {
53 149140     149140 1 259629 my $self = shift;
54 149140         300506 my $number = shift;
55 149140 50       968905 if (ref($number) eq 'ARRAY') {
    50          
    50          
56 0         0 $self->_prefix = shift @$number;
57 0         0 $self->_suffix = shift @$number;
58             }
59             elsif (defined $_[0]) {
60 0         0 $self->_prefix = $number;
61 0         0 $self->_suffix = $_[0];
62             }
63             elsif ($number =~ /^(\d{3})(?:\D)?(\d{4})$/) {
64 149140         316188 my $pref = $1;
65 149140         229645 my $suff = $2;
66 149140         375865 $self->_prefix = $pref;
67 149140         335905 $self->_suffix = $suff;
68             }
69             else {
70 0         0 carp "The number is invalid zip-code.";
71 0         0 $self->_prefix = ();
72 0         0 $self->_suffix = ();
73             }
74 149140         631089 return $self;
75             }
76              
77             sub is_valid_number {
78 149140     149140 1 202642 my $self = shift;
79 149140         247699 my $pref = $self->_prefix;
80 149140         250652 my $suff = $self->_suffix;
81 149140 50 33     422372 unless ($pref || $suff) {
82 0         0 carp "Any number was not set";
83 0         0 return;
84             }
85 149140 50 33     701148 return unless $pref =~ /^\d{3}$/ && $suff =~ /^\d{4}$/;
86 149140         339951 my $re_ref = $ZIP_TABLE{$pref};
87 149140 50 33     506899 return unless defined $re_ref && ref($re_ref) eq 'ARRAY';
88 149140         203083 my $matched;
89 149140         256921 for my $re (@$re_ref) {
90 149140 100       1592061 if ($suff =~ /^$re$/) {
91 147247         219975 $matched = 1;
92 147247         225478 last;
93             }
94             }
95 149140         713716 return $matched;
96             }
97              
98 298280     298280   531262 sub _prefix : lvalue { shift->{_prefix} }
99 298280     298280   460561 sub _suffix : lvalue { shift->{_suffix} }
100              
101             1;
102             __END__