———————————package
Net::RDAP::JCard::Address;
use
strict;
use
warnings;
=pod
=head1 NAME
Net::RDAP::JCard::Address - a module representing a postal address in a
L<Net::RDAP::JCard> object.
=head1 SYNOPSIS
#
# get an object by calling the jcard() method on a Net::RDAP::Object::Entity
#
my $jcard = $entity->jcard;
#
# get the first address. You can also uses $jcard->addresses() to get all
# ADR properties.
#
my $adr = $jcard->first_address;
if ($adr->structured) {
#
# This is a structured address so we can extract the individual components:
#
map { say "Street: ".$_ } @{$adr->street};
say "Locality: ".$adr->locality;
say "Region: ".$adr->region;
say "Postal Code: ".$adr->code;
say "Country: ".($adr->cc || $adr->country);
} else {
#
# This is an unstructured address, so just print it:
#
say "Address:".$adr->address;
}
=head1 DESCRIPTION
The L<vCard|https://www.rfc-editor.org/rfc/rfc6350.html#section-6.3.1> and
representations of postal address data can be quite difficult to deal with, and
often cause difficulties.
L<Net::RDAP::JCard::Address> provides an ergonomic interface to C<ADR> properties
in jCard objects.
To get a L<Net::RDAP::JCard::Address>, use the C<first_address()> or C<addresses()>
methods of L<Net::RDAP::JCard> to get an array of address objects.
=head1 METHODS
L<Net::RDAP::JCard::Address> inherits from L<Net::RDAP::JCard::Property>, and
therefore inherits all that module's methods, in addition to the following:
=head2 ADDRESS TYPE
$structured = $adr->structured;
Returns true if the address is "structured" (see L<Section 3.3.1.3 of RFC
=cut
sub
structured {
my
$self
=
shift
;
return
(
'ARRAY'
eq
ref
(
$self
->value) && any {
length
> 0 } @{
$self
->value});
}
=pod
=head2 FLAT ADDRESS
say $adr->address;
Returns a multi-line text string containing the address. For "unstructured"
addresses, this is the only format available, and is therefore the simplest
way to display the address information.
=cut
sub
address {
my
$self
=
shift
;
if
(
$self
->structured) {
return
join
(
"\n"
,
grep
{
length
> 0 } (
$self
->pobox,
$self
->extended,
@{
$self
->street},
$self
->locality,
$self
->region,
$self
->code,
$self
->cc ||
$self
->country
));
}
else
{
return
$self
->param(
'label'
);
}
}
=pod
=head2 P.O. BOX NUMBER
say $adr->pobox;
Returns the Post Office box number, or C<undef>.
=cut
sub
pobox {
shift
->value->[0] }
=pod
=head2 EXTENDED ADDRESS
say $adr->extended;
Returns the "extended" address component, such as the apartment or suite number, or C<undef>.
=cut
sub
extended {
shift
->value->[1] }
=pod
=head2 STREET ADDRESS
map { say $_ } @{$adr->street};
Some structured addresses have a single street address, but some have multiple
street addresses which are represented as an arrayref.
This method will always return an arrayref, which may contain zero, one, or
many values.
=cut
sub
street {
my
$self
=
shift
;
my
$street
=
$self
->value->[2];
return
(
'ARRAY'
eq
ref
(
$street
) ?
$street
: [
$street
]);
}
=pod
=head2 LOCALITY
say $adr->locality;
Returns the locality, or C<undef>.
=cut
sub
locality {
shift
->value->[3] }
=pod
=head2 REGION
say $adr->region;
Returns the region, or C<undef>.
=cut
sub
region {
shift
->value->[4] }
=pod
=head2 POSTAL CODE
say $adr->code;
Returns the postal code, or C<undef>.
=cut
sub
code {
shift
->value->[5] }
=pod
=head2 COUNTRY CODE
say $adr->cc;
Returns the ISO-3166-alpha2 country code (see L<Section 3.1 of RFC
8605|https://www.rfc-editor.org/rfc/rfc8605.html#section-3.1>), or C<undef>.
=cut
sub
cc {
shift
->param(
'cc'
) }
=pod
=head2 COUNTRY NAME
say $adr->country;
Returns the country name, or C<undef>.
=cut
sub
country {
shift
->value->[6] }
=pod
=head1 COPYRIGHT
Copyright 2018-2023 CentralNic Ltd, 2024-2025 Gavin Brown. For licensing information,
please see the C<LICENSE> file in the L<Net::RDAP> distribution.
=cut
1;