#!/usr/bin/perl package main; use Smonk ( 'r3d6' ); use strict; use warnings; my %rolls; for (1..100) { my $roll = r3d6; $rolls{$roll}++; } for (1..100) { my $roll = Smonk->r3d6; $rolls{$roll}++; } for (sort {$a<=>$b} keys %rolls) { print "$_ => $rolls{$_}\n"; } ##### Smonk.pm ########################### package Smonk; use warnings; use strict; use vars qw($AUTOLOAD @ISA @EXPORT_OK); @ISA = qw(Exporter); sub roll { my ($rolls, $di) = @_; my $result = $rolls; for( my $i = 0; $i < $rolls; $i++ ) { $result += int(rand($di)); } return $result; } sub AUTOLOAD { my $self = shift; if ( $AUTOLOAD =~ /^.*::r(\d+)[Dd](\d+)/ ) { return roll($1, $2); } } sub import { no strict 'refs'; my $pkg = shift; for my $dice (@_) { if ($dice =~ /r(\d+)[Dd](\d+)/) { my $meth = \sub { roll($1, $2); }; *{$pkg . '::' . $dice} = $meth; } } @EXPORT_OK = @_; Smonk->export_to_level(1, $pkg, @_); } 1;