File Coverage

blib/lib/Business/DK/Phonenumber.pm
Criterion Covered Total %
statement 90 93 96.7
branch 19 24 79.1
condition 4 5 80.0
subroutine 17 17 100.0
pod 4 4 100.0
total 134 143 93.7


line stmt bran cond sub pod time code
1             package Business::DK::Phonenumber;
2              
3 11     11   27955 use strict;
  11         26  
  11         401  
4 11     11   64 use warnings;
  11         21  
  11         440  
5 11     11   58 use vars qw($VERSION @EXPORT_OK);
  11         25  
  11         644  
6 11     11   61 use Carp qw(croak);
  11         31  
  11         743  
7 11     11   72 use base qw(Exporter);
  11         23  
  11         1100  
8 11     11   301 use 5.008;
  11         47  
  11         888  
9              
10             $VERSION = '0.09';
11             @EXPORT_OK
12             = qw(validate render generate validate_template TRUE FALSE DK_PREFIX DEFAULT_TEMPLATE);
13              
14 11     11   61 use constant TRUE => 1;
  11         33  
  11         798  
15 11     11   77 use constant FALSE => 0;
  11         19  
  11         580  
16 11     11   61 use constant DK_PREFIX => '+45';
  11         21  
  11         2689  
17 11     11   72 use constant DIGITS => 8;
  11         28  
  11         849  
18 11     11   60 use constant DEFAULT_TEMPLATE => DK_PREFIX . ' %0' . DIGITS . 'd';
  11         18  
  11         538  
19 11     11   57 use constant SEED => 99999999;
  11         27  
  11         12664  
20              
21             sub validate {
22 81     81 1 32021 my ( $self, $phonenumber ) = @_;
23              
24 81 50       292 if ( not ref $self ) {
25 81         188 $phonenumber = $self;
26             }
27              
28 81         565 $phonenumber =~ s/\s//sxmg;
29              
30 81 100       387 if ($phonenumber =~ m{
31             \A(
32             (?:[+])(?:45)(?:\d{8})| #+4512345678
33             (?:45)(?:\d{8})| #4512345678
34             (?:\d{8}) #12345678
35             )\z}sgmx
36             )
37             {
38 37         181 return TRUE;
39             } else {
40 44         259 return FALSE;
41             }
42             }
43              
44             sub render {
45 116     116 1 986 my ( $self, $phonenumber, $template ) = @_;
46              
47 116 100 100     508 if ( $self =~ m/\A[\D]+\b/smx and not ref $self ) {
    100          
48 2         3 $self = undef;
49              
50             } elsif ( not ref $self ) {
51 110         114 $template = $phonenumber;
52 110         147 $phonenumber = $self;
53 110         162 $self = undef;
54              
55             } else {
56              
57 4 100       9 if ($template) {
58 1 50       4 if ( ref $self ) {
59 1         3 $self->validate_template($template);
60             } else {
61 0         0 Class::Business::DK::Phonenumber::validate_template(
62             $template);
63             }
64             } else {
65 3   50     10 $template = $self->{template} || DEFAULT_TEMPLATE;
66             }
67              
68 4 50       10 if ( not $phonenumber ) {
69 4         7 $phonenumber = $self->{phonenumber};
70             }
71             }
72              
73 116         182 $phonenumber =~ s/\s//sxmg;
74              
75 116         4717 my @subs = $template =~ m/%(\d)+d/sxmg;
76              
77 116         172 my $sum = 0;
78 116         151 my @phonesplit = ();
79 116         206 my $phonetmp = $phonenumber;
80              
81 116         161 foreach my $sub (@subs) {
82 443         564 $sum += $sub;
83 443         7156 push @phonesplit, substr $phonetmp, 0, $sub, q{};
84             }
85              
86 116         402 my $output = sprintf $template, @phonesplit;
87              
88 116         850 return $output;
89             }
90              
91             sub generate {
92 4     4 1 4406 my ( $self, $amount, $template ) = @_;
93              
94 4 100       15 if ( not $amount ) {
95 1         4 $amount = 1;
96             }
97              
98 4 100       10 if ( not $template ) {
99 2         5 $template = DEFAULT_TEMPLATE;
100             }
101              
102 4         7 my %phonenumbers;
103 4         17 while ( keys %phonenumbers < $amount ) {
104 105 50       185 if ( ref $self ) {
105 0         0 $phonenumbers{ $self->_generate($template) }++;
106             } else {
107 105         183 $phonenumbers{ _generate($template) }++;
108             }
109             }
110              
111 4         98 my @phonenumbers = keys %phonenumbers;
112              
113 4         82 return @phonenumbers;
114             }
115              
116             sub _generate {
117 105     105   740 my ( $self, $template ) = @_;
118              
119 105         341 my $random_phone = int rand SEED;
120 105         206 my $phonenumber = sprintf '%.08d', $random_phone;
121              
122 105 50       166 if ( ref $self ) {
123 0         0 return $self->render( $phonenumber, $template );
124             } else {
125 105         116 $template = $self;
126              
127 105         171 return render( $phonenumber, $template );
128             }
129             }
130              
131             sub validate_template {
132 16     16 1 32 my ( $self, $template ) = @_;
133              
134 16         84 my @digits = $template =~ m/%(\d)+d/sxmg;
135              
136 16         86 my $sum = 0;
137 16         33 foreach my $digit (@digits) {
138 25         52 $sum += $digit;
139             }
140              
141 16 100       41 if ( $sum == DIGITS ) {
142 8         37 return TRUE;
143             } else {
144 8         36 return FALSE;
145             }
146             }
147              
148             1;
149              
150             __END__