6c0b41620de65d56bb2c3fccb6c639af9aa6318c
[catagits/HTML-Zoom.git] / lib / HTML / Zoom / StreamBase.pm
1 package HTML::Zoom::StreamBase;
2
3 use strict;
4 use warnings FATAL => 'all';
5 use HTML::Zoom::TransformBuilder;
6
7 sub _zconfig { shift->{_zconfig} }
8
9 sub peek {
10   my ($self) = @_;
11   if (exists $self->{_peeked}) {
12     return ($self->{_peeked});
13   }
14   if (my ($peeked) = $self->_next(1)) {
15     return ($self->{_peeked} = $peeked);
16   }
17   return;
18 }
19
20 sub next {
21   my ($self) = @_;
22
23   # peeked entry so return that
24
25   if (exists $self->{_peeked}) {
26     if (my $peeked_from = delete $self->{_peeked_from}) {
27       $peeked_from->next;
28     }
29     return (delete $self->{_peeked});
30   }
31
32   $self->_next;
33 }
34
35
36 sub flatten {
37   my $self = shift;
38   require HTML::Zoom::FlattenedStream;
39   HTML::Zoom::FlattenedStream->new({
40     source => $self,
41     zconfig => $self->_zconfig
42   });
43 }
44
45 sub map {
46   my ($self, $mapper) = @_;
47   require HTML::Zoom::MappedStream;
48   HTML::Zoom::MappedStream->new({
49     source => $self, mapper => $mapper, zconfig => $self->_zconfig
50   });
51 }
52
53 sub with_filter {
54   my ($self, $selector, $filter) = @_;
55   my $match = $self->_parse_selector($selector);
56   $self->_zconfig->stream_utils->wrap_with_filter($self, $match, $filter);
57 }
58
59 sub with_transform {
60   my ($self, $transform) = @_;
61   $transform->apply_to_stream($self);
62 }
63
64 sub select {
65   my ($self, $selector) = @_;
66   return HTML::Zoom::TransformBuilder->new({
67     zconfig => $self->_zconfig,
68     selector => $selector,
69     filters => [],
70     proto => $self,
71   });
72 }
73
74 sub then {
75   my ($self) = @_;
76   # see notes in HTML/Zoom.pm for why this needs to be fixed
77   $self->select($self->transform->selector);
78 }
79
80 sub apply {
81   my ($self, $code) = @_;
82   local $_ = $self;
83   $self->$code;
84 }
85
86 sub to_html {
87   my ($self) = @_;
88   $self->_zconfig->producer->html_from_stream($self);
89 }
90
91 1;