finish converting from MatchWithoutFilter to TransformBuilder
[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) {
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     return (delete $self->{_peeked});
27   }
28
29   $self->_next;
30 }
31
32
33 sub flatten {
34   my $self = shift;
35   require HTML::Zoom::FlattenedStream;
36   HTML::Zoom::FlattenedStream->new({
37     source => $self,
38     zconfig => $self->_zconfig
39   });
40 }
41
42 sub map {
43   my ($self, $mapper) = @_;
44   require HTML::Zoom::MappedStream;
45   HTML::Zoom::MappedStream->new({
46     source => $self, mapper => $mapper, zconfig => $self->_zconfig
47   });
48 }
49
50 sub with_filter {
51   my ($self, $selector, $filter) = @_;
52   my $match = $self->_parse_selector($selector);
53   $self->_zconfig->stream_utils->wrap_with_filter($self, $match, $filter);
54 }
55
56 sub with_transform {
57   my ($self, $transform) = @_;
58   $transform->apply_to_stream($self);
59 }
60
61 sub select {
62   my ($self, $selector) = @_;
63   return HTML::Zoom::TransformBuilder->new({
64     zconfig => $self->_zconfig,
65     selector => $selector,
66     filters => [],
67     proto => $self,
68   });
69 }
70
71 sub apply {
72   my ($self, $code) = @_;
73   local $_ = $self;
74   $self->$code;
75 }
76
77 1;