{ package Stream; use Moo; has fh => (is => 'ro'); has _buffer => (is => 'rw', default => ""); sub next_token { my ($self) = @_; my $buffer = $self->_buffer; until ($buffer =~ /\S/) { $buffer = readline $self->fh; die "End of file" unless defined $buffer; } $buffer =~ s/(\S+)//; my $token = "$1"; $self->_buffer($buffer); return $token } }