use strict ; use warnings ; use Data::Dumper ; my @limit = (reverse 1..5) ; my $limit = { _l => \@limit } ; bless ( $limit, 'limit' ) ; sub countdown { my $val = shift ; my $iter = sub { if ( $val-- ) { $_[0] = $val ; return 1 ; } return ; } ; return $iter ; } while ( my $iter = $limit->Next( *countdown ) ) { while ( $iter->( my $a ) ) { print "$a: " ; } print "\n" ; } package limit ; use strict ; use warnings ; use Data::Dumper ; sub Next { my $this = shift ; if ( @{$this->{_l}} ) { return $_[0]->( shift @{$this->{_l}} ) ; } return ; } ;