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