1use strict;
2use warnings;
3package EventTest;
4use parent qw(Mixin::Event::Dispatch);
5use Test::More;
6
7# Turn on the fallback to on_* event handlers
8use constant EVENT_DISPATCH_ON_FALLBACK => 1;
9
10sub new { bless {}, shift }
11sub test_event_count { shift->{seen_test_event} }
12sub on_test_event {
13	my $self = shift;
14	++$self->{seen_test_event};
15}
16sub on_evt_with_parameters {
17	my $self = shift;
18	my %args = @_;
19	$self->invoke_event(parameters => [ %args ]);
20}
21
22package main;
23use Test::More tests => 14;
24
25my $obj = new_ok('EventTest');
26ok($obj->invoke_event('test_event'), 'can invoke event with method available');
27is($obj->test_event_count, 1, 'event count correct');
28my $second = 0;
29ok($obj->add_handler_for_event('second_test' => sub { ++$second; 0 }), 'can add handler for event');
30is($second, 0, 'count is zero before invoking event');
31ok($obj->invoke_event('second_test'), 'can invoke event with queued handler');
32is($second, 1, 'count is 1 after invoking event');
33is($obj->invoke_event('second_test'), $obj, 'still returns $self when handler no longer present');
34is($second, 1, 'count is 1 after invoking event again');
35is($obj->test_event_count, 1, 'event count correct');
36
37ok($obj->add_handler_for_event(parameters => sub {
38	my $self = shift;
39	my $param_ref = shift;
40	my %param = @$param_ref;
41	is($param{first}, 17, 'first parameter is 17');
42	is($param{second}, 'test', 'second parameter is test');
43}), 'add parameters handler');
44my %hash = (
45	first => 17,
46	second	=> 'test'
47);
48ok($obj->invoke_event(evt_with_parameters => %hash), 'invoke with hash');
49