From: Matt S Trout Date: Thu, 1 Jul 2010 02:31:53 +0000 (+0100) Subject: factor out application of a match+filter to a stream into a Transform object X-Git-Tag: release_0.009004~48 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=655965b3451d9a284a9601daaa16a3341a45fb8b;hp=b5a48c47bf8e416e5950f59543a6759fc128f38e;p=catagits%2FHTML-Zoom.git factor out application of a match+filter to a stream into a Transform object --- diff --git a/lib/HTML/Zoom.pm b/lib/HTML/Zoom.pm index 7aef7e7..fd7602e 100644 --- a/lib/HTML/Zoom.pm +++ b/lib/HTML/Zoom.pm @@ -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 } diff --git a/lib/HTML/Zoom/FilterStream.pm b/lib/HTML/Zoom/FilterStream.pm index a0bc6b7..4bee41c 100644 --- a/lib/HTML/Zoom/FilterStream.pm +++ b/lib/HTML/Zoom/FilterStream.pm @@ -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 index 0000000..b604c2d --- /dev/null +++ b/lib/HTML/Zoom/Transform.pm @@ -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;