File Coverage

blib/lib/Data/FormValidator/Constraints/Japanese.pm
Criterion Covered Total %
statement 119 123 96.7
branch 2 4 50.0
condition 10 17 58.8
subroutine 32 32 100.0
pod 8 8 100.0
total 171 184 92.9


line stmt bran cond sub pod time code
1             # $Id: Japanese.pm 5 2007-02-05 09:11:33Z daisuke $
2             #
3             # Copyright (c) 2006 Daisuke Maki
4             # All rights reserved.
5              
6             package Data::FormValidator::Constraints::Japanese;
7 5     5   312694 use strict;
  5         15  
  5         198  
8 5     5   28 use vars qw($VERSION %EXPORT_TAGS @EXPORT_OK);
  5         9  
  5         396  
9 5     5   28 use base qw(Exporter);
  5         14  
  5         510  
10 5     5   5396 use Encode;
  5         75647  
  5         1737  
11             my %CLOSURES;
12              
13             BEGIN
14             {
15 5     5   14 $VERSION = '0.04';
16              
17 5         16 my @closures = qw(
18             hiragana
19             katakana
20             jp_zip
21             );
22 5         14 push @closures, map { 'jp_' . $_ . '_email' } qw(mobile imode vodafone ezweb);
  20         57  
23 5         15 foreach my $func (@closures) {
24 35         127 my $code = qq!
25             sub $func {
26             \$CLOSURES{$func} ||= sub {
27             my \$dfv = shift;
28             \$dfv->name_this('$func');
29             no strict 'refs';
30             return &{"_match_$func"}(\@_);
31             };
32             return \$CLOSURES{$func};
33             };
34             !;
35 35   50 5 1 3837 eval $code;
  5   50 5 1 44  
  5   50 5 1 11  
  5   50 5 1 371  
  5   50 5 1 31  
  5   50 5 1 11  
  5   50 5 1 306  
  5     2   39  
  5     4   74  
  5     4   289  
  5     4   36  
  5     4   9  
  5     4   730  
  5     4   27  
  5     4   10  
  5         313  
  5         27  
  5         9  
  5         306  
  5         29  
  5         24  
  5         305  
  2         2131  
  2         9  
  2         76  
  2         12  
  0         0  
  0         0  
  0         0  
  0         0  
  3         10492  
  3         15  
  3         108  
  3         19  
  2         21779  
  2         10  
  2         135  
  2         14  
  2         2364  
  2         9  
  2         82  
  2         12  
  8         7673  
  8         29  
  8         283  
  8         34  
  20         21527  
  20         66  
  20         789  
  20         78  
  4         5614  
  4         169  
  4         43  
  4         152  
  4         44  
  4         157  
  4         46  
  4         157  
  4         54  
  4         189  
  4         40  
  4         53  
  4         56  
  4         259  
36 35 50       147 die "Couldn't create $func: $@" if $@;
37             }
38              
39            
40             %EXPORT_TAGS = (
41 5         37 closures => [@closures, 'jp_length'],
42             );
43 35         73 $EXPORT_TAGS{all} = [
44 40         71 (map { "match_" . $_ } grep { $_ ne 'jp_length' } map { @$_ } values %EXPORT_TAGS),
  5         23  
  5         32  
45 5         25 map { @$_ } values %EXPORT_TAGS
46             ];
47 5         14 @EXPORT_OK = @{$EXPORT_TAGS{all}};
  5         2491  
48             }
49              
50             my $DASH_UTF = decode('euc-jp', "¡¼¡Ý¡½-");
51             sub _match_hiragana
52             {
53 3     3   1008 require Encode::Detect;
54 3         4421 my($value) = @_;
55 3         13 my $utf = decode('Detect', $value);
56 3     1   330 return $utf !~ /[^\p{InHiragana}$DASH_UTF]/;
  1         901  
  1         8  
  1         12  
57             }
58              
59             sub _match_katakana
60             {
61 2     2   15 require Encode::Detect;
62 2         5 my($value) = @_;
63 2         11 my $utf = decode('Detect', $value);
64 2         173 return $utf !~ /[^\p{InKatakana}$DASH_UTF]/;
65             }
66              
67             sub _match_jp_mobile_email
68             {
69 20     20   94 require Mail::Address::MobileJp;
70 20         59 Mail::Address::MobileJp::is_mobile_jp($_[0]);
71             }
72              
73             sub _match_jp_zip
74             {
75 7     7   33 $_[0] =~ /^\d{3}\-?\d{4}$/
76             }
77              
78             sub _match_jp_imode_email
79             {
80 1     1   7 require Mail::Address::MobileJp;
81 1         6 Mail::Address::MobileJp::is_imode($_[0]);
82             }
83              
84             sub _match_jp_ezweb_email
85             {
86 2     2   960 require Mail::Address::MobileJp;
87 2         1087 Mail::Address::MobileJp::is_ezweb($_[0]);
88             }
89              
90             sub _match_jp_vodafone_email
91             {
92 2     2   10 require Mail::Address::MobileJp;
93 2         8 Mail::Address::MobileJp::is_vodafone($_[0]);
94             }
95              
96             sub _check_jp_length
97             {
98 3     3   940 require Encode::Detect;
99 3         3923 my $l = length(decode('Detect', $_[0]));
100             return
101 3 50 100     225 @_ >= 2 ? $_[1] <= $l && $_[2] >= $l :
102             $_[1] <= $l;
103             }
104              
105             sub jp_length
106             {
107 4     4 1 16 my($min, $max) = @_;
108             return sub {
109 3     3   2622 my $dfv = shift;
110 3         10 $dfv->name_this('jp_length');
111 5     5   36 no strict 'refs';
  5         10  
  5         422  
112 3         16 return &{"_check_jp_length"}(@_, $min, $max);
  3         11  
113 4         103 };
114             }
115              
116             1;
117              
118             __END__