package Test::Bot::BasicBot::Pluggable;
$Test::Bot::BasicBot::Pluggable::VERSION = '1.20';
use warnings;
use strict;
use base qw( Bot::BasicBot::Pluggable );

sub new {
    my ( $class, %args ) = @_;
    my $bot = $class->SUPER::new(
        store => 'Memory',
        nick  => 'test_bot',
        %args
    );
    return bless $bot, $class;
}

sub tell_private {
    return shift->tell( shift, 1, 1 );
}    # tell the module something privately

sub tell_direct { return shift->tell( shift, 0, 1 ) }

sub tell_indirect {
    return shift->tell( shift, 0, 0 );
}    # the module has seen something

sub tell {
    my ( $bot, $body, $private, $addressed, $who ) = @_;
    my @reply;
    my $message = {
        body       => $body,
        who        => $who || 'test_user',
        channel    => $private ? 'msg' : '#test',
        address    => $addressed,
        reply_hook => sub { push @reply, $_[1]; },    # $_[1] is the reply text
    };
    if ( $body =~ /^help/ and $addressed ) {
        push @reply, $bot->help($message);
    }
    else {
        $bot->said($message);
    }
    return join "\n", @reply;
}

sub connect {
    my $self = shift;
    $self->dispatch('connected');
}

# otherwise AUTOLOAD in Bot::BasicBot will be called
sub DESTROY { }

1;

__END__

=head1 NAME

Test::Bot::BasicBot::Pluggable - utilities to aid in testing of Bot::BasicBot::Pluggable modules

=head1 VERSION

version 1.20

=head1 SYNOPSIS

  use Test::More;
  use Test::Bot::BasicBot::Pluggable;

  my $bot = Test::Bot::BasicBot->new();
  $bot->load('MyModule');

  is ( $bot->tell_direct('foo'),   'bar');
  is ( $bot->tell_indirect('foo'), 'bar');
  is ( $bot->tell_private('foo'),  'bar');

=head1 DESCRIPTION

Test::Bot::BasicBot::Pluggable was written to provide a
minimalistic testing bot in order to write cleaner unit tests for
Bot::BasicBot::Pluggable modules. 

=head1 SUBROUTINES/METHODS

=head2 new

Creates a new Test::Bot::BasicBot::Pluggable object, which is
basically just a subclass of Bot::BasicBot::Pluggable with a few
special methods. The default nickname is 'test_bot' and it contains
a in-memory store instead of sqlite. It takes the same arguments as
Bot::BasicBot::Pluggable.

=head1 INSTANCE METHODS

=head2 tell_direct

Sends the provided string to the bot like it was send directly to the bot in a public channel. The channel is called '#test' and the sending user 'test_user'.

  test_user@#test> test_bot: foo

=head2 tell_indirect

Sends the provided string to the bot like it was send to a public channel without addressing. The channel is called '#test' and the sending user 'test_user'.

  test_user@#test> foo

=head2 tell_private

Sends the provided string to the bot like it was send in a private channel. The sending user 'test_user'.

  test_user@test_bot> foo

=head2 tell

This is the working horse of Test::Bot::BasicBot::Pluggable. It
basically builds a message hash as argument to the bots said()
function. You should never have to call it directly.

=head2 connect

Dispatch the connected event to all loaded modules without actually
connecting to anything.

=head2 DESTROY

The special subroutine is explicitly overridden with an empty
subroutine as otherwise AUTOLOAD in Bot::BasicBot will be called
for it.

=head1 BUGS AND LIMITATIONS

There are no methods to test join, part and emote.

=head1 AUTHOR

Mario Domgoergen <mdom@cpan.org>

=head1 LICENSE AND COPYRIGHT

Copyright 2009 Mario Domgoergen, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
