sub make_iter { my $f = shift @_; my @todo = $f->(@_); return sub { while (@todo) { my $todo = shift @todo; if (ref($todo) eq 'CODE') { unshift @todo, $todo->(); } elsif (ref($todo) eq 'ARRAY') { return @$todo; } else { return $$todo; } } return; }; }