Perl x Open Food Facts Hackathon: Paris, France - May 24-25 Learn more

use List::Util qw(any);
use strict;
=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
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
=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;