make then() work on streams and fix up replace_content on in_place_close elements
[catagits/HTML-Zoom.git] / lib / HTML / Zoom / Transform.pm
index b604c2d..e43474c 100644 (file)
@@ -3,11 +3,13 @@ package HTML::Zoom::Transform;
 use strict;
 use warnings FATAL => 'all';
 use base qw(HTML::Zoom::SubObject);
+use HTML::Zoom::TransformedStream;
 
 sub new {
   my ($class, $args) = @_;
   my $new = $class->SUPER::new($args);
   $new->{selector} = $args->{selector};
+  $new->{match} = $args->{match} if $args->{match};
   $new->{filters} = $args->{filters}||[];
   $new;
 }
@@ -20,16 +22,24 @@ sub with_filter {
   my ($self, $filter) = @_;
   (ref $self)->new({
     selector => $self->selector,
+    ($self->{match} ? (match => $self->{match}) : ()),
     filters => [ @{$self->filters}, $filter ]
   });
 }
 
+sub match {
+  my ($self) = @_;
+  $self->{match} ||=
+    $self->_zconfig
+         ->selector_parser
+         ->parse_selector($self->{selector});
+}
+
 sub apply_to_stream {
   my ($self, $stream) = @_;
-  HTML::Zoom::FilterStream->new({
+  HTML::Zoom::TransformedStream->new({
     stream => $stream,
-    match => $self->selector,
-    filters => $self->filters,
+    transform => $self,
     zconfig => $self->_zconfig,
   });
 }