#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; { package My; sub new { return bless{ rng => $_[1] // sub { 1 + int rand($_[0]) } }, $_[0] } sub rand { $_[0]->{rng}($_[1]) } } my $o = 'My'->new(); say o => $o->rand(6) for 1 .. 7; my @values = 1 .. 6; my $i; my $t = 'My'->new(sub { $values[$i++ % @values] }); say t => $t->rand(6) for 1 .. 7;