File Coverage

blib/lib/Business/ISSN.pm
Criterion Covered Total %
statement 59 59 100.0
branch 15 16 93.7
condition n/a
subroutine 16 16 100.0
pod 5 5 100.0
total 95 96 98.9


line stmt bran cond sub pod time code
1             package Business::ISSN;
2              
3 2     2   1421 use strict;
  2         4  
  2         58  
4              
5 2     2   10 use warnings;
  2         4  
  2         46  
6 2     2   10 no warnings;
  2         3  
  2         78  
7              
8 2     2   1084 use subs qw(_common_format _checksum is_valid_checksum);
  2         51  
  2         10  
9              
10 2     2   122 use Exporter qw(import);
  2         4  
  2         1533  
11              
12             our @EXPORT = qw();
13             our @EXPORT_OK = qw(is_valid_checksum);
14              
15             our $VERSION = '1.004';
16              
17             sub new {
18 7     7 1 2508 my $class = shift;
19 7         15 my $common_data = _common_format shift;
20              
21 7 100       16 return unless $common_data;
22              
23 5         11 my $self = bless {}, $class;
24              
25 5         12 $self->{'issn'} = $common_data;
26              
27 5         16 $common_data =~m/([0-9]{7,7})([0-9\dxX])$/;
28              
29 5         9 @{$self}{ qw(checksum code) } = ( $2, $1 );
  5         19  
30              
31 5         13 $self->_check_validity;
32              
33 5         12 return $self;
34             }
35              
36 21     21   44 sub _issn { $_[0]->{'issn'} }
37 13     13 1 1466 sub is_valid { $_[0]->{'valid'} }
38 2     2 1 11 sub checksum { $_[0]->{'checksum'} }
39 4     4   8 sub _hyphen_positions { 4 }
40              
41             sub fix_checksum {
42 4     4 1 7 my $self = shift;
43 4         6 my $debug = 1;
44              
45 4         7 my $last_char = substr($self->_issn, -1, 1);
46              
47 4         8 my $checksum = _checksum $self->_issn;
48              
49 4         10 substr( $self->{issn}, -1, 1) = $checksum;
50              
51 4         11 $self->_check_validity;
52              
53 4 100       13 return 0 if $last_char eq $checksum;
54 2         6 return 1;
55             }
56              
57             sub as_string {
58 6 100   6 1 15 return unless $_[0]->is_valid;
59              
60 4         9 my $issn = $_[0]->_issn;
61              
62 4         9 substr($issn, $_[0]->_hyphen_positions, 0) = '-';
63              
64 4         14 return $issn;
65             }
66              
67             sub is_valid_checksum {
68 16     16   30 my $data = _common_format shift;
69 16 100       35 return 0 unless $data;
70 14 100       32 return 1 if substr($data, -1, 1) eq _checksum $data;
71 6         18 return 0;
72             }
73              
74             sub _check_validity {
75 9     9   17 $_[0]->{'valid'} = is_valid_checksum( $_[0]->_issn );
76             }
77              
78             sub _checksum {
79 18     18   27 my $data = _common_format shift;
80              
81 18 50       36 return unless $data;
82              
83 18         55 my @digits = split //, $data;
84 18         22 my $sum = 0;
85              
86 18         38 foreach( reverse 2..8 ) # oli 10
87             {
88 126         206 $sum += $_ * (shift @digits);
89             }
90              
91             #return what the check digit should be
92 18         32 my $checksum = (11 - ($sum % 11))%11;
93              
94 18 100       37 $checksum = 'X' if $checksum == 10;
95              
96 18         49 return $checksum;
97             }
98              
99             sub _common_format {
100             #we want uppercase X's
101 41     41   74 my $data = uc shift;
102              
103             #get rid of everything except decimal digits and X
104 41         123 $data =~ s/[^0-9X]//g;
105              
106 41 100       145 return $data if $data =~ m/^[0-9]{7}[0-9X]\z/;
107              
108 4         8 return;
109             }
110              
111             1;
112             __END__