
=head1 NAME

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

=head1 CLASS INHERITANCE

 User::Identity::Collection
   is a User::Identity::Item

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

=head1 SYNOPSIS

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

 # Simpler
 use User::Identity;
 my $me    = User::Identity->new(...);
 my $set   = $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::Locations

=item * User::Identity::Collection::Emails

=item * User::Identity::Collection::Systems

=back

=head1 METHODS

=head2 Initiation

=over 4

=item B<new> [NAME], OPTIONS

(Class method)

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

=over 4

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

See User::Identity::Item::new(description)

=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

See User::Identity::Item::new(name)

=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 which type that is) 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<description> 

See User::Identity::Item::description()

=item B<name> 

See User::Identity::Item::name()

=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|undef

Find the object with the specified NAME in this collection.  With C<undef>,
a randomly selected role is returned.

When a code reference is specified, all collected roles are scanned one
after the other (in unknown 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.

Examples:

 my $emails = $ui->collection('emails');
 $emails->find('work');

 sub find_work($$) {
    my ($mail, $emails) = @_;
    $mail->location->name eq 'work';
 }
 my @at_work = $emails->find(\&find_work);
 my @at_work = $ui->find(location => \&find_work);
 my $any     = $ui->find(location => undef );

=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.04.

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.
