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) = @_;
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
--- /dev/null
+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;