Commit | Line | Data |
5f74b883 |
1 | package HTML::Zoom::StreamBase; |
2 | |
1cf03540 |
3 | use strictures 1; |
97192b02 |
4 | use HTML::Zoom::TransformBuilder; |
d80786d0 |
5 | |
6 | sub _zconfig { shift->{_zconfig} } |
5f74b883 |
7 | |
3cdbc13f |
8 | sub peek { |
9 | my ($self) = @_; |
10 | if (exists $self->{_peeked}) { |
11 | return ($self->{_peeked}); |
12 | } |
12bfb3b7 |
13 | if (my ($peeked) = $self->_next(1)) { |
3cdbc13f |
14 | return ($self->{_peeked} = $peeked); |
15 | } |
16 | return; |
17 | } |
18 | |
b5a48c47 |
19 | sub next { |
20 | my ($self) = @_; |
21 | |
22 | # peeked entry so return that |
23 | |
24 | if (exists $self->{_peeked}) { |
12bfb3b7 |
25 | if (my $peeked_from = delete $self->{_peeked_from}) { |
26 | $peeked_from->next; |
27 | } |
b5a48c47 |
28 | return (delete $self->{_peeked}); |
29 | } |
30 | |
31 | $self->_next; |
32 | } |
33 | |
34 | |
3cdbc13f |
35 | sub flatten { |
8a1c87d1 |
36 | my $self = shift; |
37 | require HTML::Zoom::FlattenedStream; |
38 | HTML::Zoom::FlattenedStream->new({ |
39 | source => $self, |
40 | zconfig => $self->_zconfig |
3cdbc13f |
41 | }); |
42 | } |
43 | |
44 | sub map { |
8a1c87d1 |
45 | my ($self, $mapper) = @_; |
46 | require HTML::Zoom::MappedStream; |
47 | HTML::Zoom::MappedStream->new({ |
48 | source => $self, mapper => $mapper, zconfig => $self->_zconfig |
3cdbc13f |
49 | }); |
50 | } |
51 | |
d80786d0 |
52 | sub with_filter { |
53 | my ($self, $selector, $filter) = @_; |
54 | my $match = $self->_parse_selector($selector); |
55 | $self->_zconfig->stream_utils->wrap_with_filter($self, $match, $filter); |
56 | } |
57 | |
97192b02 |
58 | sub with_transform { |
59 | my ($self, $transform) = @_; |
60 | $transform->apply_to_stream($self); |
d80786d0 |
61 | } |
62 | |
97192b02 |
63 | sub select { |
d80786d0 |
64 | my ($self, $selector) = @_; |
97192b02 |
65 | return HTML::Zoom::TransformBuilder->new({ |
66 | zconfig => $self->_zconfig, |
67 | selector => $selector, |
68 | filters => [], |
69 | proto => $self, |
70 | }); |
d80786d0 |
71 | } |
72 | |
a88c1c57 |
73 | sub then { |
74 | my ($self) = @_; |
75 | # see notes in HTML/Zoom.pm for why this needs to be fixed |
76 | $self->select($self->transform->selector); |
77 | } |
78 | |
1c4455ae |
79 | sub apply { |
80 | my ($self, $code) = @_; |
81 | local $_ = $self; |
82 | $self->$code; |
83 | } |
84 | |
fdb039c6 |
85 | sub apply_if { |
86 | my ($self, $predicate, $code) = @_; |
87 | if($predicate) { |
88 | local $_ = $self; |
89 | $self->$code; |
90 | } |
91 | else { |
92 | $self; |
93 | } |
94 | } |
95 | |
12bfb3b7 |
96 | sub to_html { |
97 | my ($self) = @_; |
98 | $self->_zconfig->producer->html_from_stream($self); |
99 | } |
100 | |
94a3ddd9 |
101 | sub AUTOLOAD { |
102 | my ($self, $selector, @args) = @_; |
103 | my $meth = our $AUTOLOAD; |
104 | $meth =~ s/.*:://; |
105 | return $self = $self->select($selector)->$meth(@args); |
106 | } |
107 | |
268f2c35 |
108 | sub DESTROY {} |
109 | |
5f74b883 |
110 | 1; |