=encoding utf8

=head1 NAME

User::Identity::Location - physical location of a person

=head1 INHERITANCE

 User::Identity::Location
   is a User::Identity::Item

=head1 SYNOPSIS

  use User::Identity;
  use User::Identity::Location;
  my $me   = User::Identity->new(...);
  my $addr = User::Identity::Location->new(...);
  $me->add(location => $addr);

  # Simpler

  use User::Identity;
  my $me   = User::Identity->new(...);
  my $addr = $me->add(location => ...);

=head1 DESCRIPTION

The C<User::Identity::Location> object contains the description of a physical
location of a person: home, work, travel.  The locations are collected
by a L<User::Identity::Collection::Locations|User::Identity::Collection::Locations> object.

Nearly all methods can return C<undef>.  Some methods produce language or
country specific output.

Extends L<"DESCRIPTION" in User::Identity::Item|User::Identity::Item/"DESCRIPTION">.

=head1 METHODS

Extends L<"METHODS" in User::Identity::Item|User::Identity::Item/"METHODS">.

=head2 Constructors

Extends L<"Constructors" in User::Identity::Item|User::Identity::Item/"Constructors">.

=over 4

=item $class-E<gt>B<new>( [$name], %options )

Create a new location.  You can specify a name as first argument, or
in the OPTION list.  Without a specific name, the organization is used as name.

 -Option      --Defined in          --Default
  country                             undef
  country_code                        undef
  description   User::Identity::Item  undef
  fax                                 undef
  name          User::Identity::Item  <required>
  organization                        undef
  parent        User::Identity::Item  undef
  pc                                  undef
  phone                               undef
  pobox                               undef
  pobox_pc                            undef
  postal_code                         <value of option pc>
  state                               undef
  street                              undef

=over 2

=item country => STRING

=item country_code => STRING

=item description => STRING

=item fax => STRING|ARRAY

=item name => STRING

=item organization => STRING

=item parent => OBJECT

=item pc => STRING

Short name for C<postal_code>.

=item phone => STRING|ARRAY

=item pobox => STRING

=item pobox_pc => STRING

=item postal_code => STRING

=item state => STRING

=item street => STRING

=back

=back

=head2 Attributes

Extends L<"Attributes" in User::Identity::Item|User::Identity::Item/"Attributes">.

=over 4

=item $obj-E<gt>B<city>()

The city where the address is located.

=item $obj-E<gt>B<country>()

The country where the address is located.  If the name of the country is
not known but a country code is defined, the name will be looked-up
using Geography::Countries (if installed).

=item $obj-E<gt>B<countryCode>()

Each country has an ISO standard abbreviation.  Specify the country or the
country code, and the other will be filled in automatically.

=item $obj-E<gt>B<description>()

Inherited, see L<User::Identity::Item/"Attributes">

=item $obj-E<gt>B<fax>()

One or more fax numbers, like L<phone()|User::Identity::Location/"Attributes">.

=item $obj-E<gt>B<fullAddress>()

Create an address to put on a postal mailing, in the format as normal in
the country where it must go to.  To be able to achieve that, the country
code must be known.  If the city is not specified or no street or pobox is
given, C<undef> will be returned: an incomplete address.

example: 

  print $uil->fullAddress;
  print $user->find(location => 'home')->fullAddress;

=item $obj-E<gt>B<name>( [$newname] )

Inherited, see L<User::Identity::Item/"Attributes">

=item $obj-E<gt>B<organization>()

The organization (for instance company) which is related to this location.

=item $obj-E<gt>B<phone>()

One or more phone numbers.  Please use the international notation, which
starts with C<'+'>, for instance C<+31-26-12131>.  In scalar context,
only the first number is produced.  In list context, all numbers are
presented.

=item $obj-E<gt>B<pobox>()

Post Office mail box specification.  Use C<"P.O.Box 314">, not simple C<314>.

=item $obj-E<gt>B<poboxPostalCode>()

The postal code related to the Post-Office mail box.  Defined by new() option
C<pobox_pc>.

=item $obj-E<gt>B<postalCode>()

The postal code is very country dependent.  Also, the location of the
code within the formatted string is country dependent.

=item $obj-E<gt>B<state>()

The state, which is important for some countries but certainly not for
the smaller ones.  Only set this value when you state has to appear on
printed addresses.

=item $obj-E<gt>B<street>()

Returns the address of this location.  Since Perl 5.7.3, you can use
unicode in strings, so why not format the address nicely?

=back

=head2 Collections

Extends L<"Collections" in User::Identity::Item|User::Identity::Item/"Collections">.

=over 4

=item $obj-E<gt>B<add>($collection, $role)

Inherited, see L<User::Identity::Item/"Collections">

=item $obj-E<gt>B<addCollection>( $object | <[$type], %options> )

Inherited, see L<User::Identity::Item/"Collections">

=item $obj-E<gt>B<collection>($name)

Inherited, see L<User::Identity::Item/"Collections">

=item $obj-E<gt>B<parent>( [$parent] )

Inherited, see L<User::Identity::Item/"Collections">

=item $obj-E<gt>B<removeCollection>($object|$name)

Inherited, see L<User::Identity::Item/"Collections">

=item $any-E<gt>B<type>()

Inherited, see L<User::Identity::Item/"Collections">

=item $obj-E<gt>B<user>()

Inherited, see L<User::Identity::Item/"Collections">

=back

=head2 Searching

Extends L<"Searching" in User::Identity::Item|User::Identity::Item/"Searching">.

=over 4

=item $obj-E<gt>B<find>($collection, $role)

Inherited, see L<User::Identity::Item/"Searching">

=back

=head1 DIAGNOSTICS

=over 4

=item Error: $object is not a collection.

The first argument is an object, but not of a class which extends
L<User::Identity::Collection|User::Identity::Collection>.
Cast by addCollection()

=item Error: Cannot load collection module for $type ($class).

Either the specified C<$type> does not exist, or that module named C<$class> returns
compilation errors.  If the type as specified in the warning is not
the name of a package, you specified a nickname which was not defined.
Maybe you forgot the 'require' the package which defines the nickname.
Cast by addCollection()

=item Error: Creation of a collection via $class failed.

The C<$class> did compile, but it was not possible to create an object
of that class using the options you specified.
Cast by addCollection()

=item Error: Don't know what type of collection you want to add.

If you add a collection, it must either by a collection object or a
list of options which can be used to create a collection object.  In
the latter case, the type of collection must be specified.
Cast by addCollection()

=item Warning: No collection $name

The collection with C<$name> does not exist and can not be created.
Cast by add()

=back

=head1 SEE ALSO

This module is part of User-Identity version 1.03,
built on September 12, 2025. Website: F<http://perl.overmeer.net/CPAN/>

=head1 LICENSE

For contributors see file ChangeLog.

This software is copyright (c) 2003-2025 by Mark Overmeer.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

