From: Matt S Trout Date: Thu, 1 Jul 2010 04:03:30 +0000 (+0100) Subject: move to TransformBuilder in Zoom X-Git-Tag: release_0.009004~46 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FHTML-Zoom.git;a=commitdiff_plain;h=eeeb09216f2e342591152b2ef2e07bb814a5698d move to TransformBuilder in Zoom --- diff --git a/lib/HTML/Zoom.pm b/lib/HTML/Zoom.pm index befc092..abf6be7 100644 --- a/lib/HTML/Zoom.pm +++ b/lib/HTML/Zoom.pm @@ -4,9 +4,9 @@ use strict; use warnings FATAL => 'all'; use HTML::Zoom::ZConfig; -use HTML::Zoom::MatchWithoutFilter; use HTML::Zoom::ReadFH; use HTML::Zoom::Transform; +use HTML::Zoom::TransformBuilder; sub new { my ($class, $args) = @_; @@ -74,27 +74,37 @@ sub memoize { ref($self)->new($self)->from_html($self->to_html); } -sub with_filter { +sub with_transform { my $self = shift->_self_or_new; - my ($selector, $filter) = @_; + my ($transform) = @_; $self->_with({ transforms => [ @{$self->{transforms}||[]}, - HTML::Zoom::Transform->new({ - zconfig => $self->zconfig, - selector => $selector, - filters => [ $filter ] - }) + $transform ] }); } + +sub with_filter { + my $self = shift->_self_or_new; + my ($selector, $filter) = @_; + $self->with_transform( + HTML::Zoom::Transform->new({ + zconfig => $self->zconfig, + selector => $selector, + filters => [ $filter ] + }) + ); +} sub select { my $self = shift->_self_or_new; my ($selector) = @_; - return HTML::Zoom::MatchWithoutFilter->construct( - $self, $selector, $self->zconfig->filter_builder, - ); + return HTML::Zoom::TransformBuilder->new({ + zconfig => $self->zconfig, + selector => $selector, + proto => $self + }); } # There's a bug waiting to happen here: if you do something like diff --git a/lib/HTML/Zoom/TransformBuilder.pm b/lib/HTML/Zoom/TransformBuilder.pm new file mode 100644 index 0000000..122c66c --- /dev/null +++ b/lib/HTML/Zoom/TransformBuilder.pm @@ -0,0 +1,36 @@ +package HTML::Zoom::TransformBuilder; + +use strict; +use warnings FATAL => 'all'; +use base qw(HTML::Zoom::SubObject); + +sub new { + my ($class, $args) = @_; + my $new = $class->SUPER::new($args); + $new->{transform} = + $args->{transform} + || HTML::Zoom::Transform->new({ + zconfig => $new->{_zconfig}, + selector => $args->{selector}, + filters => [], + }); + $new->{proto} = $args->{proto}; + $new +} + +sub DESTROY {} + +sub AUTOLOAD { + my $meth = our $AUTOLOAD; + $meth =~ s/.*:://; + my $self = shift; + my $fb = $self->_zconfig->filter_builder; + if (my $cr = $fb->can($meth)) { + return $self->{proto}->with_transform( + $self->{transform}->with_filter($fb->$cr(@_)) + ); + } + die "Filter builder $fb does not provide action ${meth}"; +} + +1;