move to TransformBuilder in Zoom
Matt S Trout [Thu, 1 Jul 2010 04:03:30 +0000 (05:03 +0100)]
lib/HTML/Zoom.pm
lib/HTML/Zoom/TransformBuilder.pm [new file with mode: 0644]

index befc092..abf6be7 100644 (file)
@@ -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 (file)
index 0000000..122c66c
--- /dev/null
@@ -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;