#!/usr/bin/perl
# your code goes here

sub makeIteratorClass {
        my ($f) = @_;

        sub gensym {
                my @chars = ("A".."Z", "a".."z");
                my $string;
                $string .= $chars[rand @chars] for 1..8;
                return $string;
        };

        return sub {
                my ($iv) = @_;

                my $self = { iv => $iv };
                my $sym = gensym();
                *{ "$sym" . "::getNext" } = sub {
                        my ($self) = @_;
                        $self->{iv} = $f->($self->{iv});
                        return $self->{iv};
                };
                bless $self, $sym;
                return $self;
        }
}

my $plusOner = makeIteratorClass(sub { my ($x) = @_; $x + 1 });
my $o = $plusOner->(5);
print $o->getNext();
print $o->getNext();
print $o->getNext();