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

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

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

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

has plaintext => (
    is       => 'ro',
    isa      => 'Str',
    lazy     => 1,
    builder  => '_build_plaintext',
);

sub _build_plaintext { shift->message }

__PACKAGE__->meta->make_immutable;
no Moose;

1;

__END__

=head1 NAME

IM::Engine::Message - an instant message, IRC line, etc.

=head1 SYNOPSIS

    my $message = ...;

    print $message->message;

    print $message->plaintext;

=head1 ATTRIBUTES

=head2 message

The exact message that this object encapsulates.

=head2 plaintext

The message that this object encapsulates but with any formatting stripped. For example, if this message represents an AIM IM, HTML will be stripped from the C<plaintext>.

=head1 SEE ALSO

=over 4

=item L<IM::Engine::Message::HTMLish>

=item L<IM::Engine::Incoming>

=item L<IM::Engine::Outgoing>

=back

=cut