Initial commit
[number-phone-ro.git] / lib / Number / Phone / RO.pm
1 package Number::Phone::RO;
2
3 use 5.014000;
4 use strict;
5 use warnings;
6 use parent qw/Number::Phone/;
7 use utf8;
8 use re '/s';
9
10 sub AREA_NAMES (); ## no critic (ProhibitSubroutinePrototypes)
11
12 our $VERSION = '0.001';
13
14 our %cache;
15
16 sub _normalized {
17 my ($nr) = @_;
18 $nr =~ y/0-9+//cd;
19 $nr =~ s/^[+]40//;
20 $nr =~ s/^0//;
21 $nr
22 }
23
24 sub _analyze_number {
25 my ($nr) = @_;
26 my %info;
27
28 return { valid => 0 } unless length $nr == 9;
29 $info{valid} = 1;
30
31 $info{geographic} = $nr =~ /^[23][3-6]/ ? 1 : 0;
32 @info{qw/fixed_line mobile/} = (1, 0) if $nr =~ /^[23]/;
33 @info{qw/fixed_line mobile/} = (0, 1) if $nr =~ /^7/;
34 $info{tollfree} = $nr =~ /^800/ ? 1 : 0;
35 $info{specialrate} = $nr =~ /^90/ ? 1 : 0;
36 $info{adult} = 1 if $nr =~ /^906/;
37
38 my $arealen = $nr =~ /^[23]1/ ? 2 : 3;
39 $info{areacode} = substr $nr, 0, $arealen;
40 $info{subscriber} = substr $nr, $arealen;
41
42 \%info
43 }
44
45 sub _info { $cache{${$_[0]}} }
46
47 sub new {
48 my ($class, $nr) = @_;
49 $nr = _normalized $nr;
50 $cache{$nr} = _analyze_number $nr;
51 my $self = bless \$nr, $class;
52 $self->is_valid ? $self : undef
53 }
54
55 sub is_valid { shift->_info->{valid} }
56 sub is_geographic { shift->_info->{geographic} }
57 sub is_fixed_line { shift->_info->{fixed_line} }
58 sub is_mobile { shift->_info->{mobile} }
59 sub is_tollfree { shift->_info->{tollfree} }
60 sub is_specialrate { shift->_info->{specialrate} }
61 sub is_adult { shift->_info->{adult} }
62
63 sub country_code { 40 }
64 sub regulator { 'ANCOM, http://ancom.org.ro'}
65
66 sub areacode { shift->_info->{areacode} }
67 sub areaname { $_[0]->is_geographic ? AREA_NAMES->{substr $_[0]->areacode, 1} : undef }
68 sub subscriber { shift->_info->{subscriber} }
69
70 sub format { ## no critic (ProhibitBuiltinHomonyms)
71 my ($self) = @_;
72 join ' ',
73 '+40',
74 $self->areacode,
75 (substr $self->subscriber, 0, 3),
76 (substr $self->subscriber, 3);
77 }
78
79 sub intra_country_dial_to { "0${$_[0]}" }
80
81 use constant AREA_NAMES => {
82 1 => 'București',
83 30 => 'Suceava',
84 31 => 'Botoșani',
85 32 => 'Iași',
86 33 => 'Neamț',
87 34 => 'Bacău',
88 35 => 'Vaslui',
89 36 => 'Galați',
90 37 => 'Vrancea',
91 38 => 'Buzău',
92 39 => 'Brăila',
93 40 => 'Tulcea',
94 41 => 'Constanța',
95 42 => 'Călărași',
96 43 => 'Ialomița',
97 44 => 'Prahova',
98 45 => 'Dâmbovița',
99 46 => 'Giurgiu',
100 47 => 'Teleorman',
101 48 => 'Argeș',
102 49 => 'Olt',
103 50 => 'Vâlcea',
104 51 => 'Dolj',
105 52 => 'Mehedinți',
106 53 => 'Gorj',
107 54 => 'Hunedoara',
108 55 => 'Caraș-Severin',
109 56 => 'Timiș',
110 57 => 'Arad',
111 58 => 'Alba',
112 59 => 'Bihor',
113 60 => 'Sălaj',
114 61 => 'Satu Mare',
115 62 => 'Maramureș',
116 63 => 'Bistrița-Năsăud',
117 64 => 'Cluj',
118 65 => 'Mureș',
119 66 => 'Harghita',
120 67 => 'Covasna',
121 68 => 'Brașov',
122 69 => 'Sibiu',
123 };
124
125 1;
126 __END__
127
128 =encoding utf-8
129
130 =head1 NAME
131
132 Number::Phone::RO - Phone number information for Romania (+40)
133
134 =head1 SYNOPSIS
135
136 use Number::Phone::RO;
137 my $nr = Number::Phone::RO->new('+40250123456');
138 say $nr->is_geographic; # 1
139 say $nr->is_fixed_line; # 1
140 say $nr->is_mobile; # 0
141 say $nr->is_tollfree; # 0
142 say $nr->is_specialrate; # 0
143 say $nr->areacode; # 250
144 say $nr->areaname; # Vâlcea
145 say $nr->subscriber; # 123456
146 say $nr->format; # +40 250 123 456
147
148 =head1 DESCRIPTION
149
150 This module is a work in progress. See the L<TODO> section below.
151
152 See the L<Number::Phone> documentation for usage information. The
153 following methods from L<Number::Phone> are overridden:
154
155 =over
156
157 =item B<is_geographic>
158
159 =item B<is_fixed_line>
160
161 =item B<is_mobile>
162
163 =item B<is_tollfree>
164
165 =item B<is_specialrate>
166
167 =item B<country_code>
168
169 Always returns 40.
170
171 =item B<regulator>
172
173 Returns the name and URL of the regulator, ANCOM.
174
175 =item B<areacode>
176
177 =item B<areaname>
178
179 =item B<subscriber>
180
181 =item B<format>
182
183 =back
184
185 =head1 TODO
186
187 Only long (10 digits) numbers are supported.
188
189 Should query L<http://portabilitate.ro/> to implement B<operator> and B<operator_ported>.
190
191 =head1 AUTHOR
192
193 Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
194
195 =head1 COPYRIGHT AND LICENSE
196
197 Copyright (C) 2015 by Marius Gavrilescu
198
199 This library is free software; you can redistribute it and/or modify
200 it under the same terms as Perl itself, either Perl version 5.20.2 or,
201 at your option, any later version of Perl 5 you may have available.
202
203
204 =cut
This page took 0.030119 seconds and 4 git commands to generate.