1use strict;
2use warnings;
3use Test::More tests => 3;
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 (Paper    $x, Spock    $y) { 1 }
18    multi method play (Scissors $x, Paper    $y) { 1 }
19    multi method play (Scissors $x, Lizard   $y) { 1 }
20    multi method play (Rock     $x, Scissors $y) { 1 }
21    multi method play (Rock     $x, Lizard   $y) { 1 }
22    multi method play (Lizard   $x, Paper    $y) { 1 }
23    multi method play (Lizard   $x, Spock    $y) { 1 }
24    multi method play (Spock    $x, Rock     $y) { 1 }
25    multi method play (Spock    $x, Scissors $y) { 1 }
26    multi method play (Any      $x, Any      $y) { 0 }
27}
28
29my $game = Game->new;
30ok($game->play(Spock->new, Scissors->new), 'Spock smashes Scissors');
31ok(!$game->play(Lizard->new, Rock->new), 'Rock crushes Lizard');
32ok(!$game->play(Spock->new, Paper->new), 'Paper disproves Spock');
33
341;
35