package IM::Engine::Incoming;
use Moose;
use MooseX::StrictConstructor;
extends 'IM::Engine::Message';
use IM::Engine::Outgoing;
use constant _reply_class => 'IM::Engine::Outgoing';
has sender => (
is => 'ro',
isa => 'IM::Engine::User',
required => 1,
);
sub reply {
my $self = shift;
my %args;
if (@_ == 1) {
%args = (message => $_[0]);
}
else {
%args = @_;
}
Carp::carp("Incoming->reply constructs an Outgoing object for you; it does not automatically send it") if !defined(wantarray);
my $outgoing = $self->_reply_class->new(
$self->_contextual_reply_arguments,
%args,
);
return $outgoing;
}
sub _contextual_reply_arguments {
my $self = shift;
return (
incoming => $self,
recipient => $self->sender,
inner,
);
}
__PACKAGE__->meta->make_immutable;
no Moose;
1;
__END__
=head1 NAME
IM::Engine::Incoming - a message we have received
=head1 ATTRIBUTES
=head2 sender
An instance of L<IM::Engine::User> which represents the sender of this incoming
message.
=head2 message
See L<IM::Engine::Message/message>.
=head2 plaintext
See L<IM::Engine::Message/plaintext>.
=head1 METHODS
=head2 reply
Constructs a L<IM::Engine::Outgoing> message that represents a reply to this
incoming message.
my $outgoing = $incoming->reply("Sorry, I didn't understand.");
You can also pass in a hash of attributes for constructing the outgoing
message.
=head1 SEE ALSO
=over 4
=item L<IM::Engine::Incoming::IRC>
=item L<IM::Engine::Incoming::Jabber>
=item L<IM::Engine::Outgoing>
=item L<IM::Engine::Message> (the superclass)
=cut