
=head1 NAME

User::Identity::Collection - base class for collecting roles of a user

=head1 CLASS INHERITANCE

 User::Identity::Collection is extended by
   User::Identity::Collection::Emails
   User::Identity::Collection::Locations

=head1 SYNOPSIS

 use User::Identity;
 use User::Identity::Collection;
 my $me   = User::Indentity->new(...);
 my $set  = User::Identity::Collection::Email->new(...);
 $me->addCollection($set);

 # Simpler
 use User::Identity;
 my $me   = User::Indentity->new(...);
 $me->addCollection(type => 'email', ...)

 my @roles = $me->collection('email');  # list of collected items

 my $coll  = $me->collection('email');  # a User::Identity::Collection
 my @roles = $coll->roles;
 my @roles = @$coll;                    # same, by overloading

 my $role  = $me->collection('email')->find($coderef);
 my $role  = $me->collection('location')->find('work');
 my $role  = $me->find(location => 'work');

=head1 DESCRIPTION

The User::Identity::Collection object maintains a set user related objects.
It helps selecting these objects, which is partially common to all collections
(for instance, each object has a name so you can search on names), and sometimes
specific to the extension of this collection.

Currently imlemented extensions are

=over 4

=item * User::Identity::Collection::Location

=item * User::Identity::Collection::Email

=back

=head1 METHODS

=head2 Initiation

=over 4

=item B<new> [NAME], OPTIONS

(Class method)

 OPTION               DEFAULT
 item_type            <required>
 name                 <required>
 roles                undef
 user                 undef

=over 4

=item B<item_type> =E<gt> CLASS

The CLASS which is used to store the information for each of the maintained
objects within this collection.

=item B<name> =E<gt> STRING

=item B<roles> =E<gt> ROLE|ARRAY

Immediately add some roles to this collection.  In case of an ARRAY, each
element of the array is passed separately to addRole(). So, you may end-up
with an ARRAY of arrays each grouping a set of options to create a role.

=item B<user> =E<gt> OBJECT

The user which has this collection of roles.

=back

=back

=head2 Overloading

=over 4

=item B<stringification> 

Returns the name of the collection and a sorted list of defined items.

Examples:

 my $locations = $ui->collection('location');
 foreach my $loc (@$location) ...
 print $location->[0];

=back

=head2 Attributes

=over 4

=item B<addRole> ROLE| ( [NAME],OPTIONS ) | ARRAY-OF-OPTIONS

Adds a new role to this collection.  ROLE is an object of the right type
(depends on the extension of this module) or a list of OPTIONS which are
used to create such role.  The options can also be passed as reference to
an array.  The added role is returned.

Examples:

 my $uicl = User::Identity::Collection::Locations->new;
 my $uil  = User::Identity::Location->new(home => ...);
 $uicl->addRole($uil);
 $uicl->addRole(home => address => 'street 32');
 $uicl->addRole( [home => address => 'street 32'] );

Easier

 $ui      = User::Identity;
 $ui->add(location => 'home', address => 'street 32' );
 $ui->add(location => [ 'home', address => 'street 32' ] );

=item B<name> 

Reports the logical name for this location.  This is the specified name or, if
that was not specified, the name of the organization.  This will always return
a valid string.

=item B<roles> 

Returns all defined roles within this collection.

=item B<user> [USER]

The user whose address this is.  This is a weak link, which means that
the location object will be removed when the user object is deleted and
no other references to this location object exist.

=back

=head2 Searching

=over 4

=item B<find> NAME|CODE

Find the object with the specified NAME in this collection.  If a code
reference is specified, all collected roles are scanned one after the
other (in unknow order).  For each role,

    CODE->($object, $collection)

is called.  When the CODE returns true, the role is selected.  In list context,
all selected roles are returned.  In scalar context, the first match is
returned and the scan is aborted immediately.

=back

=head1 SEE ALSO

See the website at L<http://perl.overmeer.net/userid/>.

=head1 AUTHOR

Written by Mark Overmeer (L<mark@overmeer.net|mailto:mark@overmeer.net>)
with the help of many.  See the ChangeLog for details.

=head1 VERSION

This code is beta, version 0.02.

Copyright (c) 2003 by the authors. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
