585e05c32fd0b919ea27007b4c8430e3fec2f843
[catagits/HTML-Zoom.git] / lib / HTML / Zoom / CodeStream.pm
1 package HTML::Zoom::CodeStream;
2
3 use strict;
4 use warnings FATAL => 'all';
5 use base qw(HTML::Zoom::StreamBase);
6
7 sub from_array {
8   my ($class, @array) = @_;
9   $class->new({ code => sub {
10     return unless @array;
11     return shift @array;
12   }});
13 }
14
15 sub new {
16   my ($class, $args) = @_;
17   bless({ _code => $args->{code} }, $class);
18 }
19
20 sub peek {
21   my ($self) = @_;
22   if (exists $self->{_peeked}) {
23     return ($self->{_peeked});
24   }
25   if (my ($peeked) = $self->next) {
26     return ($self->{_peeked} = $peeked);
27   }
28   return;
29 }
30
31 sub next {
32   my ($self) = @_;
33
34   # peeked entry so return that
35
36   if (exists $self->{_peeked}) {
37     return (delete $self->{_peeked});
38   }
39
40   $self->{_code}->();
41 }
42
43 1;
44