line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Data::Random::Contact; |
2
|
|
|
|
|
|
|
BEGIN { |
3
|
1
|
|
|
1
|
|
53858
|
$Data::Random::Contact::VERSION = '0.05'; |
4
|
|
|
|
|
|
|
} |
5
|
|
|
|
|
|
|
|
6
|
1
|
|
|
1
|
|
883
|
use namespace::autoclean; |
|
1
|
|
|
|
|
25730
|
|
|
1
|
|
|
|
|
6
|
|
7
|
|
|
|
|
|
|
|
8
|
1
|
|
|
1
|
|
513
|
use Moose; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
use Class::Load qw( load_class ); |
11
|
|
|
|
|
|
|
use Data::Random::Contact::Language::EN; |
12
|
|
|
|
|
|
|
use Data::Random::Contact::Country::US; |
13
|
|
|
|
|
|
|
use Data::Random::Contact::Types qw( Country Language ); |
14
|
|
|
|
|
|
|
use DateTime; |
15
|
|
|
|
|
|
|
use Scalar::Util qw( blessed ); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
has language => ( |
18
|
|
|
|
|
|
|
is => 'ro', |
19
|
|
|
|
|
|
|
isa => Language, |
20
|
|
|
|
|
|
|
default => 'Data::Random::Contact::Language::EN', |
21
|
|
|
|
|
|
|
); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
has country => ( |
24
|
|
|
|
|
|
|
is => 'ro', |
25
|
|
|
|
|
|
|
isa => Country, |
26
|
|
|
|
|
|
|
default => 'Data::Random::Contact::Country::US', |
27
|
|
|
|
|
|
|
); |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
override BUILDARGS => sub { |
30
|
|
|
|
|
|
|
my $class = shift; |
31
|
|
|
|
|
|
|
my $p = super(); |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
if ( $p->{language} && !blessed $p->{language} ) { |
34
|
|
|
|
|
|
|
my $language |
35
|
|
|
|
|
|
|
= $p->{language} =~ /^Data::Random::Contact::Language::/ |
36
|
|
|
|
|
|
|
? $p->{language} |
37
|
|
|
|
|
|
|
: 'Data::Random::Contact::Language::' . $p->{language}; |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
load_class($language); |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
$p->{language} = $language; |
42
|
|
|
|
|
|
|
} |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
if ( $p->{country} && !blessed $p->{country} ) { |
45
|
|
|
|
|
|
|
my $country |
46
|
|
|
|
|
|
|
= $p->{country} |
47
|
|
|
|
|
|
|
&& $p->{country} =~ /^Data::Random::Contact::Country::/ |
48
|
|
|
|
|
|
|
? $p->{country} |
49
|
|
|
|
|
|
|
: 'Data::Random::Contact::Country::' . $p->{country}; |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
load_class($country); |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
$p->{country} = $country; |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
return $p; |
56
|
|
|
|
|
|
|
}; |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
my $MaxBirthdate = DateTime->today()->subtract( years => 15 ); |
59
|
|
|
|
|
|
|
my $MinBirthdate = DateTime->today()->subtract( years => 100 ); |
60
|
|
|
|
|
|
|
my $Days = $MaxBirthdate->delta_days($MinBirthdate)->in_units('days') - 1; |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
my $Suffix = 0; |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
sub person { |
65
|
|
|
|
|
|
|
my $self = shift; |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
my %contact; |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
$contact{gender} = _percent() <= 50 ? 'male' : 'female'; |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
my $salutation_meth = $contact{gender} . '_salutation'; |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
$contact{salutation} = $self->language()->$salutation_meth(); |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
my $name_meth = $contact{gender} . '_given_name'; |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
$contact{given} = $self->language()->$name_meth(); |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
my $middle_name_meth = $contact{gender} . '_middle_name'; |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
$contact{middle} = $self->language()->$middle_name_meth(); |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
$contact{surname} = $self->language()->surname(); |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
my $suffix_meth = $contact{gender} . '_suffix'; |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
$contact{suffix} = $self->language()->$suffix_meth(); |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
$contact{birth_date} |
90
|
|
|
|
|
|
|
= $MinBirthdate->clone()->add( days => int( rand($Days) ) ); |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
for my $type (qw( mobile home work )) { |
93
|
|
|
|
|
|
|
$contact{phone}{$type} = $self->country()->phone_number(); |
94
|
|
|
|
|
|
|
} |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
for my $type (qw( home work )) { |
97
|
|
|
|
|
|
|
$contact{address}{$type} = $self->country()->address(); |
98
|
|
|
|
|
|
|
} |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
$contact{email}{home} |
101
|
|
|
|
|
|
|
= join '.', |
102
|
|
|
|
|
|
|
map {lc} grep {defined} @contact{ 'given', 'middle', 'surname' }; |
103
|
|
|
|
|
|
|
$contact{email}{home} .= '@' . $self->_domain(); |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
$contact{email}{work} = lc $contact{given} . $Suffix++; |
106
|
|
|
|
|
|
|
$contact{email}{work} .= '@' . $self->_domain(); |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
return \%contact; |
109
|
|
|
|
|
|
|
} |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
sub household { |
112
|
|
|
|
|
|
|
my $self = shift; |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
my %contact; |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
$contact{name} = $self->language()->household_name(); |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
$contact{phone}{home} = $self->country()->phone_number(); |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
$contact{address}{home} = $self->country()->address(); |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
( $contact{email}{home} = $contact{name} ) =~ s/\W/./g; |
123
|
|
|
|
|
|
|
$contact{email}{home} .= '@' . $self->_domain(); |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
return \%contact; |
126
|
|
|
|
|
|
|
} |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
sub organization { |
129
|
|
|
|
|
|
|
my $self = shift; |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
my %contact; |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
$contact{name} = $self->language()->organization_name(); |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
$contact{phone}{office} = $self->country()->phone_number(); |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
for my $type (qw( headquarters branch )) { |
138
|
|
|
|
|
|
|
$contact{address}{$type} = $self->country()->address(); |
139
|
|
|
|
|
|
|
} |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
( $contact{email}{home} = $contact{name} ) =~ s/\W/./g; |
142
|
|
|
|
|
|
|
$contact{email}{home} .= '@' . $self->_domain(); |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
return \%contact; |
145
|
|
|
|
|
|
|
} |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
{ |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
# Fake Name Generator uses these domains, so I assume they're safe. |
150
|
|
|
|
|
|
|
my @Domains = qw( |
151
|
|
|
|
|
|
|
pookmail.com |
152
|
|
|
|
|
|
|
trashymail.com |
153
|
|
|
|
|
|
|
dodgit.com |
154
|
|
|
|
|
|
|
mailinator.com |
155
|
|
|
|
|
|
|
spambob.com |
156
|
|
|
|
|
|
|
); |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
sub _domain { |
159
|
|
|
|
|
|
|
return @Domains[ int( rand( scalar @Domains ) ) ]; |
160
|
|
|
|
|
|
|
} |
161
|
|
|
|
|
|
|
} |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
sub _percent { |
164
|
|
|
|
|
|
|
return ( int( rand(100) ) ) + 1; |
165
|
|
|
|
|
|
|
} |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
__PACKAGE__->meta()->make_immutable(); |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
1; |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
# ABSTRACT: Generate random contact data |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
=pod |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=head1 NAME |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
Data::Random::Contact - Generate random contact data |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
=head1 VERSION |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
version 0.05 |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
=head1 SYNOPSIS |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
use Data::Random::Contact; |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
my $randomizer = Data::Random::Contact->new(); |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
my $person = $rand->person(); |
192
|
|
|
|
|
|
|
my $household = $rand->household(); |
193
|
|
|
|
|
|
|
my $organization = $rand->organization(); |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
=head1 DESCRIPTION |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
B<This module is still alpha, and the API may change in future releases.> |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
This module generates random data for contacts. This is useful if you're |
200
|
|
|
|
|
|
|
working an application that manages this sort of data. |
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
It generates three types of contacts, people, households, and |
203
|
|
|
|
|
|
|
organizations. |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
=head1 LICENSING |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
The data that this module uses comes from several sources. Names are based on |
208
|
|
|
|
|
|
|
data from Fake Name Generator (L<http://www.fakenamegenerator.com>). This |
209
|
|
|
|
|
|
|
data is dual-licensed under GPLv3 or CC BY-SA 3.0 (United Stated). See |
210
|
|
|
|
|
|
|
http://www.fakenamegenerator.com/license.php for licensing details. |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
The address data is all B<real addresses> from the VegGuide.org website |
213
|
|
|
|
|
|
|
(L<http://vegguide.org>). This data is licensed under the CC BY-NC-SA 3.0 |
214
|
|
|
|
|
|
|
(United Stated) license. |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
All other data is generated algorithmically. |
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
Whether a license can apply to things like addresses and names is debatable, |
219
|
|
|
|
|
|
|
but I am not a lawyer. |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
=head1 METHODS |
222
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
This module provides just a few public methods: |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
=head2 Data::Random::Contact->new() |
226
|
|
|
|
|
|
|
|
227
|
|
|
|
|
|
|
This constructs a new object. It accepts two optional parameters: |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
=over 4 |
230
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
=item * language |
232
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
This can either be a language name like "EN" or an instantiated language |
234
|
|
|
|
|
|
|
class, for example L<Data::Random::Contact::Language::EN>. |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
The language is used to generate names. |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
This defaults to "EN". |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
Currently this distribution only ships with one language, English |
241
|
|
|
|
|
|
|
(L<Data::Random::Contact::Language::EN>). |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
=item * country |
244
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
This can either be a country name like "US" or an instantiated country |
246
|
|
|
|
|
|
|
class, for example L<Data::Random::Contact::Country::US>. |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
The country is used to generate phone numbers and addresses. |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
This defaults to "EN". |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
Currently this distribution only ships with one country, US |
253
|
|
|
|
|
|
|
(L<Data::Random::Contact::Country::US>). |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
=back |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
=head2 $randomizer->person() |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
This returns a random set of data for a single person. |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
See L</RETURNED DATA> for details. |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
=head2 $randomizer->household() |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
This returns a random set of data for a single household. |
266
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
See L</RETURNED DATA> for details. |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
=head2 $randomizer->organization() |
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
This returns a random set of data for a single organization. |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
See L</RETURNED DATA> for details. |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
=head1 RETURNED DATA |
276
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
Each of the methods that return contact data returns a complicated |
278
|
|
|
|
|
|
|
hashref-based data structure. |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
=head2 Shared Data |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
Some of the data is shared across all contact types: |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
All contact types return email, phone, and address data. This data is |
285
|
|
|
|
|
|
|
available under the appropriate key ("email", "phone", or "address") in the |
286
|
|
|
|
|
|
|
top-level data structure. |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
Under that key the data is further broken down by type, which will be |
289
|
|
|
|
|
|
|
something like "home", "work", "office", etc. Every contact will have all the |
290
|
|
|
|
|
|
|
valid keys set. In other words, a person will always have both a home and work |
291
|
|
|
|
|
|
|
email address. |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
The email data will always be at one of these domains: pookmail.com, |
294
|
|
|
|
|
|
|
trashymail.com, dodgit.com, mailinator.com, or spambob.com. |
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
The phone number will be a string containing all the phone number data. |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
Each address is further broken down as a hashref data structure. |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
See the appropriate language module for details on phone numbers and |
301
|
|
|
|
|
|
|
addresses. |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
Here's an example of the shared data for a person (using US data): |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
{ |
306
|
|
|
|
|
|
|
address => { |
307
|
|
|
|
|
|
|
home => { |
308
|
|
|
|
|
|
|
city => "Reno", |
309
|
|
|
|
|
|
|
postal_code => 89503, |
310
|
|
|
|
|
|
|
region => "Nevada", |
311
|
|
|
|
|
|
|
region_abbr => "NV", |
312
|
|
|
|
|
|
|
street_1 => "501 W. 1st St.", |
313
|
|
|
|
|
|
|
street_2 => undef |
314
|
|
|
|
|
|
|
}, |
315
|
|
|
|
|
|
|
work => { |
316
|
|
|
|
|
|
|
city => "Minneapolis", |
317
|
|
|
|
|
|
|
postal_code => 55406, |
318
|
|
|
|
|
|
|
region => "Minnesota", |
319
|
|
|
|
|
|
|
region_abbr => "MN", |
320
|
|
|
|
|
|
|
street_1 => "2823 E. Franklin Avenue", |
321
|
|
|
|
|
|
|
street_2 => undef |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
}, |
324
|
|
|
|
|
|
|
email => { |
325
|
|
|
|
|
|
|
home => "charlotte.t.dolan\@pookmail.com", |
326
|
|
|
|
|
|
|
work => "charlotte0\@dodgit.com" |
327
|
|
|
|
|
|
|
}, |
328
|
|
|
|
|
|
|
phone => { |
329
|
|
|
|
|
|
|
home => "508-383-7535", |
330
|
|
|
|
|
|
|
mobile => "775-371-7227", |
331
|
|
|
|
|
|
|
work => "602-995-6077" |
332
|
|
|
|
|
|
|
}, |
333
|
|
|
|
|
|
|
} |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
=head2 Person Data |
336
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
Since much of this data is language-specific, you should see the appropriate |
338
|
|
|
|
|
|
|
language module for details. Some keys may be undefined, depending on the |
339
|
|
|
|
|
|
|
language. |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
The data for a person includes: |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=over 4 |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
=item * given |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
The person's given name. |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
The set of names used is determined by the language. |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
=item * middle |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
The person's middle name or initial. |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
The set of names used is determined by the language. |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
=item * surname |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
The person's surname. |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
The set of names used is determined by the language. |
362
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
=item * gender |
364
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
This will be either "male" or "female". |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
=item * salutation |
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
A salutation for the person ("Mr", "Ms", etc.). These salutations are |
370
|
|
|
|
|
|
|
gender-specific. |
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
The set of salutations used is determined by the language. |
373
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
=item * suffix |
375
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
An optional suffix like "Jr" or "III". |
377
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
The set of salutations used is determined by the language. |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
=item * birth_date |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
A L<DateTime> object representing the person's birth date. The date will be |
383
|
|
|
|
|
|
|
somewhere between 15 and 100 years in the past. |
384
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
=item * email addresses |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
The email address types for a person are "home" and "work". |
388
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
=item * phone numbers |
390
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
The phone number types for a person are "home", "work", and "mobile". |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
=item * addresses |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
The address types for a person are "home" and "work". |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
=back |
398
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
=head2 Household Data |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
The data for a person includes: |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
=over 4 |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
=item * name |
406
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
The household name. |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
The set of names used is determined by the language. |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
=item * email addresses |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
The only email address type for a household is "home". |
414
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
=item * phone numbers |
416
|
|
|
|
|
|
|
|
417
|
|
|
|
|
|
|
The only phone number type for a household is "home". |
418
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
=item * addresses |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
The only address type for a household is "home". |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
=back |
424
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
=head2 Organization Data |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
The data for a person includes: |
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
=over 4 |
430
|
|
|
|
|
|
|
|
431
|
|
|
|
|
|
|
=item * name |
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
The organization name. |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
The set of names used is determined by the language. |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
=item * email addresses |
438
|
|
|
|
|
|
|
|
439
|
|
|
|
|
|
|
The only email address type for an organization is "home". |
440
|
|
|
|
|
|
|
|
441
|
|
|
|
|
|
|
=item * phone numbers |
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
The only phone number type for an organization is "office". |
444
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
=item * addresses |
446
|
|
|
|
|
|
|
|
447
|
|
|
|
|
|
|
The address types for a organization are "headquarters" and "branch". |
448
|
|
|
|
|
|
|
|
449
|
|
|
|
|
|
|
=back |
450
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
=head2 Data Dumps |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
Here are complete data dumps for each contact type: |
454
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
=over 4 |
456
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
=item * Person |
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
{ |
460
|
|
|
|
|
|
|
given => "Gregory", |
461
|
|
|
|
|
|
|
middle => "Antoine", |
462
|
|
|
|
|
|
|
surname => "Jones", |
463
|
|
|
|
|
|
|
birth_date => bless( {'...'}, 'DateTime' ), |
464
|
|
|
|
|
|
|
salutation => "Mr", |
465
|
|
|
|
|
|
|
suffix => "IV", |
466
|
|
|
|
|
|
|
gender => "male", |
467
|
|
|
|
|
|
|
address => { |
468
|
|
|
|
|
|
|
home => { |
469
|
|
|
|
|
|
|
city => "Boulder", |
470
|
|
|
|
|
|
|
postal_code => 80304, |
471
|
|
|
|
|
|
|
region => "Colorado", |
472
|
|
|
|
|
|
|
region_abbr => "CO", |
473
|
|
|
|
|
|
|
street_1 => "2785 Iris Avenue", |
474
|
|
|
|
|
|
|
street_2 => undef |
475
|
|
|
|
|
|
|
}, |
476
|
|
|
|
|
|
|
work => { |
477
|
|
|
|
|
|
|
city => "Albuquerque", |
478
|
|
|
|
|
|
|
postal_code => 87106, |
479
|
|
|
|
|
|
|
region => "New Mexico", |
480
|
|
|
|
|
|
|
region_abbr => "NM", |
481
|
|
|
|
|
|
|
street_1 => "2110 Central Ave SE", |
482
|
|
|
|
|
|
|
street_2 => undef |
483
|
|
|
|
|
|
|
} |
484
|
|
|
|
|
|
|
}, |
485
|
|
|
|
|
|
|
email => { |
486
|
|
|
|
|
|
|
home => "gregory.antoine.jones\@trashymail.com", |
487
|
|
|
|
|
|
|
work => "gregory0\@pookmail.com" |
488
|
|
|
|
|
|
|
}, |
489
|
|
|
|
|
|
|
phone => { |
490
|
|
|
|
|
|
|
home => "881-348-3582", |
491
|
|
|
|
|
|
|
mobile => "727-862-8526", |
492
|
|
|
|
|
|
|
work => "305-389-4232" |
493
|
|
|
|
|
|
|
}, |
494
|
|
|
|
|
|
|
} |
495
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
=item * Household |
497
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
{ |
499
|
|
|
|
|
|
|
name => "The Briley Household", |
500
|
|
|
|
|
|
|
address => { |
501
|
|
|
|
|
|
|
home => { |
502
|
|
|
|
|
|
|
city => "Lombard", |
503
|
|
|
|
|
|
|
postal_code => undef, |
504
|
|
|
|
|
|
|
region => "Illinois", |
505
|
|
|
|
|
|
|
region_abbr => "IL", |
506
|
|
|
|
|
|
|
street_1 => "2361 Fountain Square Dr.", |
507
|
|
|
|
|
|
|
street_2 => undef |
508
|
|
|
|
|
|
|
} |
509
|
|
|
|
|
|
|
}, |
510
|
|
|
|
|
|
|
email => { home => "The.Briley.Household\@mailinator.com" }, |
511
|
|
|
|
|
|
|
phone => { home => "307-342-9913" } |
512
|
|
|
|
|
|
|
} |
513
|
|
|
|
|
|
|
|
514
|
|
|
|
|
|
|
=item * Organization |
515
|
|
|
|
|
|
|
|
516
|
|
|
|
|
|
|
{ |
517
|
|
|
|
|
|
|
name => "pastorate womanish", |
518
|
|
|
|
|
|
|
address => { |
519
|
|
|
|
|
|
|
branch => { |
520
|
|
|
|
|
|
|
city => "Northbrook", |
521
|
|
|
|
|
|
|
postal_code => undef, |
522
|
|
|
|
|
|
|
region => "Illinois", |
523
|
|
|
|
|
|
|
region_abbr => "IL", |
524
|
|
|
|
|
|
|
street_1 => "1819 Lake Cook Rd.", |
525
|
|
|
|
|
|
|
street_2 => undef |
526
|
|
|
|
|
|
|
}, |
527
|
|
|
|
|
|
|
headquarters => { |
528
|
|
|
|
|
|
|
city => "Springfield", |
529
|
|
|
|
|
|
|
postal_code => undef, |
530
|
|
|
|
|
|
|
region => "New Jersey", |
531
|
|
|
|
|
|
|
region_abbr => "NJ", |
532
|
|
|
|
|
|
|
street_1 => "518 Millburn Ave", |
533
|
|
|
|
|
|
|
street_2 => undef |
534
|
|
|
|
|
|
|
} |
535
|
|
|
|
|
|
|
}, |
536
|
|
|
|
|
|
|
email => { home => "pastorate.womanish\@mailinator.com" }, |
537
|
|
|
|
|
|
|
phone => { office => "876-278-8382" } |
538
|
|
|
|
|
|
|
} |
539
|
|
|
|
|
|
|
|
540
|
|
|
|
|
|
|
=back |
541
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
=head1 AUTHOR |
543
|
|
|
|
|
|
|
|
544
|
|
|
|
|
|
|
Dave Rolsky <autarch@urth.org> |
545
|
|
|
|
|
|
|
|
546
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
547
|
|
|
|
|
|
|
|
548
|
|
|
|
|
|
|
This software is Copyright (c) 2011 by Dave Rolsky. |
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
This is free software, licensed under: |
551
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
The Artistic License 2.0 (GPL Compatible) |
553
|
|
|
|
|
|
|
|
554
|
|
|
|
|
|
|
=cut |
555
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
__END__ |
558
|
|
|
|
|
|
|
|