dwim selects and bugfixes, new transform_attribute method and handled trailing '...
[catagits/HTML-Zoom.git] / lib / HTML / Zoom / StreamBase.pm
1 package HTML::Zoom::StreamBase;
2
3 use strictures 1;
4 use HTML::Zoom::TransformBuilder;
5
6 sub _zconfig { shift->{_zconfig} }
7
8 sub peek {
9   my ($self) = @_;
10   if (exists $self->{_peeked}) {
11     return ($self->{_peeked});
12   }
13   if (my ($peeked) = $self->_next(1)) {
14     return ($self->{_peeked} = $peeked);
15   }
16   return;
17 }
18
19 sub next {
20   my ($self) = @_;
21
22   # peeked entry so return that
23
24   if (exists $self->{_peeked}) {
25     if (my $peeked_from = delete $self->{_peeked_from}) {
26       $peeked_from->next;
27     }
28     return (delete $self->{_peeked});
29   }
30
31   $self->_next;
32 }
33
34
35 sub flatten {
36   my $self = shift;
37   require HTML::Zoom::FlattenedStream;
38   HTML::Zoom::FlattenedStream->new({
39     source => $self,
40     zconfig => $self->_zconfig
41   });
42 }
43
44 sub map {
45   my ($self, $mapper) = @_;
46   require HTML::Zoom::MappedStream;
47   HTML::Zoom::MappedStream->new({
48     source => $self, mapper => $mapper, zconfig => $self->_zconfig
49   });
50 }
51
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
58 sub with_transform {
59   my ($self, $transform) = @_;
60   $transform->apply_to_stream($self);
61 }
62
63 sub select {
64   my ($self, $selector) = @_;
65   return HTML::Zoom::TransformBuilder->new({
66     zconfig => $self->_zconfig,
67     selector => $selector,
68     filters => [],
69     proto => $self,
70   });
71 }
72
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
79 sub apply {
80   my ($self, $code) = @_;
81   local $_ = $self;
82   $self->$code;
83 }
84
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
96 sub to_html {
97   my ($self) = @_;
98   $self->_zconfig->producer->html_from_stream($self);
99 }
100
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
108 1;