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