The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package IM::Engine::User;
use Moose;
use MooseX::StrictConstructor;

use IM::Engine::ExtendsObject::User;
with 'IM::Engine::PluggableConstructor' => {
    role_specifier => '+IM::Engine::ExtendsObject::User',
};

has '+_trait_namespace' => (default => __PACKAGE__);

has name => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

sub canonical_name {
    my $self = shift;
    return $self->name;
}

__PACKAGE__->meta->make_immutable;
no Moose;

1;

__END__

=head1 NAME

IM::Engine::User - a user that we're IMing

=head1 ATTRIBUTES

=head2 name

The verbatim screenname (or nickname or jid or ...) of the user.

=head1 METHODS

=head2 canonical_name

This method returns the name but with "arbitrary stuff" removed. This is more
useful for storing the name in a database, or for comparing names.

While documenting this method it gave me a bad feeling, so it very well may go
away. C<:)>

=head1 SEE ALSO

=over 4

=item L<IM::Engine::User::AIM>

=item L<IM::Engine::User::Jabber>

=back

=cut