File Coverage

lib/Lingua/JA/Romaji/Valid/Rule.pm
Criterion Covered Total %
statement 61 61 100.0
branch 21 24 87.5
condition 8 9 88.8
subroutine 14 14 100.0
pod 7 7 100.0
total 111 115 96.5


line stmt bran cond sub pod time code
1             package Lingua::JA::Romaji::Valid::Rule;
2              
3 4     4   27 use strict;
  4         10  
  4         139  
4 4     4   25 use warnings;
  4         9  
  4         109  
5 4     4   2538 use Lingua::JA::Romaji::Valid::Filter::Word;
  4         14  
  4         132  
6 4     4   2681 use Lingua::JA::Romaji::Valid::Filter::Kana;
  4         603  
  4         2735  
7              
8             my $Verbose;
9              
10             sub new {
11 308     308 1 394 my $class = shift;
12 308         1711 my $self = bless {}, $class;
13              
14 308         1721 my %valid = ( a => 1, e => 1, i => 1, o => 1, u => 1, n => 1 );
15 308         740 foreach my $c ( $self->valid_consonants ) {
16 8150 100 100     43008 if ( length $c == 2 or $c eq 'j' or $c eq 'y' ) {
      100        
17 4213         5640 foreach my $v ( qw( a o u ) ) {
18 12639         27321 $valid{ "$c$v" } = 1;
19             }
20             }
21             else {
22 3937         5574 foreach my $v ( qw( a e i o u ) ) {
23 19685         48639 $valid{ "$c$v" } = 1;
24             }
25             }
26             }
27 308         1383 foreach my $item ( $self->should_delete ) {
28 1160         2068 delete $valid{$item};
29             }
30 308         3571 foreach my $item ( $self->should_add ) {
31 2759         5125 $valid{$item} = 1;
32             }
33              
34 308         935 $self->{valid} = \%valid;
35              
36 308         1222 $self->{filters} = {
37             word => Lingua::JA::Romaji::Valid::Filter::Word->new,
38             kana => Lingua::JA::Romaji::Valid::Filter::Kana->new,
39             };
40              
41 308         1256 $self;
42             }
43              
44 328     328 1 899 sub valid_consonants { shift->_value( valid_consonants => @_ ) }
45 328     328 1 1148 sub should_delete { shift->_value( should_delete => @_ ) }
46 328     328 1 661 sub should_add { shift->_value( should_add => @_ ) }
47 1161     1161 1 2936 sub filters { shift->_value( filters => @_ ) }
48              
49             sub _value {
50 2145     2145   3593 my ($self, $name, @data) = @_;
51 2145   66     6067 my $class = ref $self || $self;
52              
53 4     4   26 no strict 'refs';
  4         8  
  4         1553  
54 2145 100       4859 if ( @data ) {
55 75         91 @{ "$class\::$name" } = @data;
  75         424  
56             }
57 2145         3271 @{ "$class\::$name" };
  2145         14901  
58             }
59              
60             sub _prepare {
61 339     339   485 my ($self, $word_ref, @extra_filters) = @_;
62              
63 339         625 foreach my $filter ( $self->filters, @extra_filters ) {
64 1262 100       5358 next unless $self->{filters}->{word}->can( $filter );
65 492 100       2271 unless ( $self->{filters}->{word}->$filter( $word_ref ) ) {
66 2 50       10 warn "$filter returned false" if $Verbose;
67 2         17 return;
68             }
69             }
70 337         1364 return 1;
71             }
72              
73             sub is_valid {
74 802     802 1 1541 my ($self, $kana, @extra_filters) = @_;
75              
76 802         1381 foreach my $filter ( $self->filters, @extra_filters ) {
77 3035 100       11640 next unless $self->{filters}->{kana}->can( $filter );
78 1848 100       7047 unless ( $self->{filters}->{kana}->$filter( \$kana ) ) {
79 7 50       16 warn "$filter returned false" if $Verbose;
80 7         53 return;
81             }
82             }
83              
84 795 100       2509 my $ret = exists $self->{valid}->{$kana} ? 1 : 0;
85 795 100       1727 unless ( $ret ) {
86 127 50       302 warn "$kana is not valid" if $Verbose;
87             }
88 795         3877 return $ret;
89             }
90              
91 322 100   322 1 332 sub verbose { shift; @_ ? $Verbose = shift : $Verbose }
  322         890  
92              
93             1;
94              
95             __END__