--- /dev/null
+Revision history for Perl extension Number::Phone::RO.
+
+0.001 2015-05-30T23:30+03:00
+ - Initial release
--- /dev/null
+Changes
+Makefile.PL
+MANIFEST
+README
+t/Number-Phone-RO.t
+t/perlcritic.t
+t/perlcriticrc
+lib/Number/Phone/RO.pm
--- /dev/null
+use 5.014000;
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+ NAME => 'Number::Phone::RO',
+ VERSION_FROM => 'lib/Number/Phone/RO.pm',
+ AUTHOR => 'Marius Gavrilescu <marius@ieval.ro>',
+ MIN_PERL_VERSION => '5.14.0',
+ LICENSE => 'perl',
+ SIGN => 1,
+ PREREQ_PM => {
+ qw/Number::Phone 0/,
+ },
+ META_ADD => {
+ dynamic_config => 0,
+ resources => {
+ repository => 'https://git.ieval.ro/?p=number-phone-ro.git',
+ },
+ }
+);
--- /dev/null
+Number-Phone-RO version 0.001
+=============================
+
+Number::Phone::RO is a Number::Phone extension for Romanian phone
+numbers.
+
+INSTALLATION
+
+To install this module type the following:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+DEPENDENCIES
+
+This module requires these other modules and libraries:
+
+* Number::Phone
+
+COPYRIGHT AND LICENCE
+
+Copyright (C) 2015 by Marius Gavrilescu
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.20.2 or,
+at your option, any later version of Perl 5 you may have available.
+
+
--- /dev/null
+package Number::Phone::RO;
+
+use 5.014000;
+use strict;
+use warnings;
+use parent qw/Number::Phone/;
+use utf8;
+use re '/s';
+
+sub AREA_NAMES (); ## no critic (ProhibitSubroutinePrototypes)
+
+our $VERSION = '0.001';
+
+our %cache;
+
+sub _normalized {
+ my ($nr) = @_;
+ $nr =~ y/0-9+//cd;
+ $nr =~ s/^[+]40//;
+ $nr =~ s/^0//;
+ $nr
+}
+
+sub _analyze_number {
+ my ($nr) = @_;
+ my %info;
+
+ return { valid => 0 } unless length $nr == 9;
+ $info{valid} = 1;
+
+ $info{geographic} = $nr =~ /^[23][3-6]/ ? 1 : 0;
+ @info{qw/fixed_line mobile/} = (1, 0) if $nr =~ /^[23]/;
+ @info{qw/fixed_line mobile/} = (0, 1) if $nr =~ /^7/;
+ $info{tollfree} = $nr =~ /^800/ ? 1 : 0;
+ $info{specialrate} = $nr =~ /^90/ ? 1 : 0;
+ $info{adult} = 1 if $nr =~ /^906/;
+
+ my $arealen = $nr =~ /^[23]1/ ? 2 : 3;
+ $info{areacode} = substr $nr, 0, $arealen;
+ $info{subscriber} = substr $nr, $arealen;
+
+ \%info
+}
+
+sub _info { $cache{${$_[0]}} }
+
+sub new {
+ my ($class, $nr) = @_;
+ $nr = _normalized $nr;
+ $cache{$nr} = _analyze_number $nr;
+ my $self = bless \$nr, $class;
+ $self->is_valid ? $self : undef
+}
+
+sub is_valid { shift->_info->{valid} }
+sub is_geographic { shift->_info->{geographic} }
+sub is_fixed_line { shift->_info->{fixed_line} }
+sub is_mobile { shift->_info->{mobile} }
+sub is_tollfree { shift->_info->{tollfree} }
+sub is_specialrate { shift->_info->{specialrate} }
+sub is_adult { shift->_info->{adult} }
+
+sub country_code { 40 }
+sub regulator { 'ANCOM, http://ancom.org.ro'}
+
+sub areacode { shift->_info->{areacode} }
+sub areaname { $_[0]->is_geographic ? AREA_NAMES->{substr $_[0]->areacode, 1} : undef }
+sub subscriber { shift->_info->{subscriber} }
+
+sub format { ## no critic (ProhibitBuiltinHomonyms)
+ my ($self) = @_;
+ join ' ',
+ '+40',
+ $self->areacode,
+ (substr $self->subscriber, 0, 3),
+ (substr $self->subscriber, 3);
+}
+
+sub intra_country_dial_to { "0${$_[0]}" }
+
+use constant AREA_NAMES => {
+ 1 => 'București',
+ 30 => 'Suceava',
+ 31 => 'Botoșani',
+ 32 => 'Iași',
+ 33 => 'Neamț',
+ 34 => 'Bacău',
+ 35 => 'Vaslui',
+ 36 => 'Galați',
+ 37 => 'Vrancea',
+ 38 => 'Buzău',
+ 39 => 'Brăila',
+ 40 => 'Tulcea',
+ 41 => 'Constanța',
+ 42 => 'Călărași',
+ 43 => 'Ialomița',
+ 44 => 'Prahova',
+ 45 => 'Dâmbovița',
+ 46 => 'Giurgiu',
+ 47 => 'Teleorman',
+ 48 => 'Argeș',
+ 49 => 'Olt',
+ 50 => 'Vâlcea',
+ 51 => 'Dolj',
+ 52 => 'Mehedinți',
+ 53 => 'Gorj',
+ 54 => 'Hunedoara',
+ 55 => 'Caraș-Severin',
+ 56 => 'Timiș',
+ 57 => 'Arad',
+ 58 => 'Alba',
+ 59 => 'Bihor',
+ 60 => 'Sălaj',
+ 61 => 'Satu Mare',
+ 62 => 'Maramureș',
+ 63 => 'Bistrița-Năsăud',
+ 64 => 'Cluj',
+ 65 => 'Mureș',
+ 66 => 'Harghita',
+ 67 => 'Covasna',
+ 68 => 'Brașov',
+ 69 => 'Sibiu',
+};
+
+1;
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+Number::Phone::RO - Phone number information for Romania (+40)
+
+=head1 SYNOPSIS
+
+ use Number::Phone::RO;
+ my $nr = Number::Phone::RO->new('+40250123456');
+ say $nr->is_geographic; # 1
+ say $nr->is_fixed_line; # 1
+ say $nr->is_mobile; # 0
+ say $nr->is_tollfree; # 0
+ say $nr->is_specialrate; # 0
+ say $nr->areacode; # 250
+ say $nr->areaname; # Vâlcea
+ say $nr->subscriber; # 123456
+ say $nr->format; # +40 250 123 456
+
+=head1 DESCRIPTION
+
+This module is a work in progress. See the L<TODO> section below.
+
+See the L<Number::Phone> documentation for usage information. The
+following methods from L<Number::Phone> are overridden:
+
+=over
+
+=item B<is_geographic>
+
+=item B<is_fixed_line>
+
+=item B<is_mobile>
+
+=item B<is_tollfree>
+
+=item B<is_specialrate>
+
+=item B<country_code>
+
+Always returns 40.
+
+=item B<regulator>
+
+Returns the name and URL of the regulator, ANCOM.
+
+=item B<areacode>
+
+=item B<areaname>
+
+=item B<subscriber>
+
+=item B<format>
+
+=back
+
+=head1 TODO
+
+Only long (10 digits) numbers are supported.
+
+Should query L<http://portabilitate.ro/> to implement B<operator> and B<operator_ported>.
+
+=head1 AUTHOR
+
+Marius Gavrilescu, E<lt>marius@ieval.roE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2015 by Marius Gavrilescu
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.20.2 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut
--- /dev/null
+#!/usr/bin/perl
+use strict;
+use warnings;
+use utf8;
+
+use Test::More tests => 22;
+BEGIN { use_ok('Number::Phone::RO') };
+
+my $nr;
+
+sub num {
+ my ($num) = @_;
+ note "Now working with the number $num";
+ $nr = Number::Phone::RO->new($num);
+}
+
+num '0';
+ok !defined $nr, 'Constructor returns undef';
+
+num '0350123456';
+ok $nr->is_geographic, 'is_geographic';
+ok $nr->is_fixed_line, 'is_fixed_line';
+ok !$nr->is_mobile, '!is_mobile';
+ok !$nr->is_tollfree, 'is_tollfree';
+ok !$nr->is_specialrate, 'is_specialrate';
+is $nr->areacode, '350', 'areacode';
+is $nr->areaname, 'Vâlcea', 'areaname';
+is $nr->subscriber, '123456', 'subscriber';
+is $nr->format, '+40 350 123 456', 'format';
+
+num '0211234567';
+is $nr->areacode, '21', 'areacode';
+is $nr->subscriber, '1234567', 'subscriber';
+is $nr->format, '+40 21 123 4567', 'format';
+
+num '0800123123';
+is $nr->intra_country_dial_to, '0800123123', 'intra_country_dial_to';
+ok $nr->is_tollfree, 'is_tollfree';
+is $nr->country_code, 40, 'country_code';
+like $nr->regulator, qr/ANCOM/, 'regulator';
+ok !defined $nr->areaname, 'areaname is undef';
+
+num '0906123456';
+ok $nr->is_adult, 'is_adult';
+
+num '0731123456';
+ok $nr->is_mobile, 'is_mobile';
+ok !$nr->is_fixed_line, 'is_fixed_line';
--- /dev/null
+#!/usr/bin/perl
+use v5.14;
+use warnings;
+
+use Test::More;
+
+BEGIN { plan skip_all => '$ENV{RELEASE_TESTING} is false' unless $ENV{RELEASE_TESTING} }
+use Test::Perl::Critic -profile => 't/perlcriticrc';
+
+all_critic_ok
--- /dev/null
+severity = 1
+
+[-BuiltinFunctions::ProhibitComplexMappings]
+[-CodeLayout::RequireTidyCode]
+[-ControlStructures::ProhibitPostfixControls]
+[-ControlStructures::ProhibitUnlessBlocks]
+[-Documentation::PodSpelling]
+[-Documentation::RequirePodLinksIncludeText]
+[-InputOutput::RequireBracedFileHandleWithPrint]
+[-Modules::ProhibitAutomaticExportation]
+[-References::ProhibitDoubleSigils]
+[-RegularExpressions::ProhibitEnumeratedClasses]
+[-RegularExpressions::RequireLineBoundaryMatching]
+[-Subroutines::RequireFinalReturn]
+[-ValuesAndExpressions::ProhibitConstantPragma]
+[-ValuesAndExpressions::ProhibitEmptyQuotes]
+[-ValuesAndExpressions::ProhibitLeadingZeros]
+[-ValuesAndExpressions::ProhibitMagicNumbers]
+[-ValuesAndExpressions::ProhibitNoisyQuotes]
+[-Variables::ProhibitLocalVars]
+[-Variables::ProhibitPackageVars]
+[-Variables::ProhibitPunctuationVars]
+
+[BuiltinFunctions::ProhibitStringyEval]
+allow_includes = 1
+
+[RegularExpressions::RequireExtendedFormatting]
+minimum_regex_length_to_complain_about = 20
+
+[Documentation::RequirePodSections]
+lib_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT AND LICENSE
+script_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT AND LICENSE
+
+[Subroutines::RequireArgUnpacking]
+short_subroutine_statements = 5
+allow_subscripts = 1