1use strict;
2use warnings;
3use Test::More tests => 5;
4
5{
6    package Paper;    use Moose;
7    package Scissors; use Moose;
8    package Rock;     use Moose;
9    package Lizard;   use Moose;
10    package Spock;    use Moose;
11
12    package Game;
13    use Moose;
14    use MooseX::MultiMethods;
15
16    multi method play (Paper    $x, Rock     $y) { 1 }
17    multi method play (Scissors $x, Paper    $y) { 1 }
18    multi method play (Rock     $x, Scissors $y) { 1 }
19    multi method play (Any      $x, Any      $y) { 0 }
20
21    package Game::Extended;
22    use Moose;
23    use MooseX::MultiMethods;
24    extends 'Game';
25
26    multi method play (Paper    $x, Spock    $y) { 1 }
27    multi method play (Scissors $x, Lizard   $y) { 1 }
28    multi method play (Rock     $x, Lizard   $y) { 1 }
29    multi method play (Lizard   $x, Paper    $y) { 1 }
30    multi method play (Lizard   $x, Spock    $y) { 1 }
31    multi method play (Spock    $x, Rock     $y) { 1 }
32    multi method play (Spock    $x, Scissors $y) { 1 }
33}
34
35my $game = Game->new;
36ok($game->play(Scissors->new, Paper->new), 'Scissors cuts Paper');
37
38my $egame = Game::Extended->new;
39ok($egame->play(Scissors->new, Paper->new), 'Scissors cuts Paper');
40
41ok($egame->play(Spock->new, Scissors->new), 'Spock smashes Scissors');
42ok(!$egame->play(Lizard->new, Rock->new), 'Rock crushes Lizard');
43ok(!$egame->play(Spock->new, Paper->new), 'Paper disproves Spock');
44
451;
46
47