Having been a long-time gamer, and wanting to stretch my brain around IMPORTING AUTOLOADED FUNCTIONS, I came up with this little package.
package Games::Dice;
use warnings;
use strict;
use vars '$AUTOLOAD';
sub AUTOLOAD {
if ( $AUTOLOAD =~ /^.*::(\d+)[Dd](\d+)/ ) {
buildsub($AUTOLOAD,$1,$2);
goto &$AUTOLOAD;
}
}
sub buildsub {
my ($name,$rolls,$die) = @_;
my $sub = <<END_SUB;
sub $name {
my \$result = $rolls;
for( my \$i = 0; \$i < $rolls; \$i++ ) {
\$result += int(rand($die));
}
return \$result;
}
END_SUB
eval $sub;
die "Oops, dropped a die" if ($@);
}
sub import {
no strict 'refs';
my $pkg = shift;
my $caller = caller(0);
for my $dice (@_) {
if ($dice =~ /(\d+)[Dd](\d+)/) {
buildsub("$pkg\::$dice",$1,$2);
*{"$caller\::$dice"} = \&{"$pkg\::$dice"};
}
}
}
1;
# Example use
package main;
use Games::Dice ( '3d6' );
my %rolls;
for (1..1000) {
my $roll = main::3d6; # The main:: is required because???
$rolls{$roll}++;
}
for (sort {$a<=>$b} keys %rolls) {
print "$_ => $rolls{$_}\n";
}