{ package FooObj; sub new { bless { _count => 1, _data => 0 }, $_[0] } sub add_data { my $self = shift; my $data = shift if (@_); print "\nCalled: data value is " . ($data || "NONE") . "\n"; if (defined $data) { die "\nError: data does not look like number\n\n" if ($data !~ /^\d+$/); } if ($self->{_count}) { $data = 5 if (!defined $data); $self->{_data} += $data; $self->{_count}--; return($self->{_data}); } } } my $bar = FooObj->new; while(my $val = $bar->add_data()) { # do something here }