factor out application of a match+filter to a stream into a Transform object
Matt S Trout [Thu, 1 Jul 2010 02:31:53 +0000 (03:31 +0100)]
lib/HTML/Zoom.pm
lib/HTML/Zoom/FilterStream.pm
lib/HTML/Zoom/Transform.pm [new file with mode: 0644]

index 7aef7e7..fd7602e 100644 (file)
@@ -6,6 +6,7 @@ use warnings FATAL => 'all';
 use HTML::Zoom::ZConfig;
 use HTML::Zoom::MatchWithoutFilter;
 use HTML::Zoom::ReadFH;
+use HTML::Zoom::Transform;
 
 sub new {
   my ($class, $args) = @_;
@@ -44,7 +45,12 @@ sub to_stream {
   my $sutils = $self->zconfig->stream_utils;
   my $stream = $sutils->stream_from_array(@{$self->{initial_events}});
   foreach my $filter_spec (@{$self->{filters}||[]}) {
-    $stream = $sutils->wrap_with_filter($stream, @{$filter_spec});
+    $stream = HTML::Zoom::Transform->new({
+                selector => $filter_spec->[0],
+                filters => [ $filter_spec->[1] ],
+                zconfig => $self->zconfig,
+              })->apply_to_stream($stream);
+    #$stream = $sutils->wrap_with_filter($stream, @{$filter_spec});
   }
   $stream
 }
index a0bc6b7..4bee41c 100644 (file)
@@ -6,6 +6,11 @@ use base qw(HTML::Zoom::StreamBase);
 
 sub new {
   my ($class, $args) = @_;
+  if ($args->{filters}) {
+    die "Single filter please (XXX FIXME)"
+      unless @{$args->{filters}} == 1;
+    $args->{filter} = $args->{filters}[0];
+  }
   bless(
     {
       _stream => $args->{stream},
diff --git a/lib/HTML/Zoom/Transform.pm b/lib/HTML/Zoom/Transform.pm
new file mode 100644 (file)
index 0000000..b604c2d
--- /dev/null
@@ -0,0 +1,38 @@
+package HTML::Zoom::Transform;
+
+use strict;
+use warnings FATAL => 'all';
+use base qw(HTML::Zoom::SubObject);
+
+sub new {
+  my ($class, $args) = @_;
+  my $new = $class->SUPER::new($args);
+  $new->{selector} = $args->{selector};
+  $new->{filters} = $args->{filters}||[];
+  $new;
+}
+
+sub selector { shift->{selector} }
+
+sub filters { shift->{filters} }
+
+sub with_filter {
+  my ($self, $filter) = @_;
+  (ref $self)->new({
+    selector => $self->selector,
+    filters => [ @{$self->filters}, $filter ]
+  });
+}
+
+sub apply_to_stream {
+  my ($self, $stream) = @_;
+  HTML::Zoom::FilterStream->new({
+    stream => $stream,
+    match => $self->selector,
+    filters => $self->filters,
+    zconfig => $self->_zconfig,
+  });
+}
+    
+
+1;