bump version
[catagits/HTML-Zoom.git] / lib / HTML / Zoom.pm
index d8c4f3a..ce0df57 100644 (file)
@@ -1,12 +1,16 @@
 package HTML::Zoom;
 
-use strict;
-use warnings FATAL => 'all';
+use strictures 1;
 
 use HTML::Zoom::ZConfig;
 use HTML::Zoom::ReadFH;
 use HTML::Zoom::Transform;
 use HTML::Zoom::TransformBuilder;
+use Scalar::Util ();
+
+our $VERSION = '0.009008';
+
+$VERSION = eval $VERSION;
 
 sub new {
   my ($class, $args) = @_;
@@ -74,6 +78,17 @@ sub apply {
   $self->$code;
 }
 
+sub apply_if {
+  my ($self, $predicate, $code) = @_;
+  if($predicate) {
+    local $_ = $self;
+    $self->$code;
+  }
+  else {
+    $self;
+  }
+}
+
 sub to_html {
   my $self = shift;
   $self->zconfig->producer->html_from_stream($self->to_stream);
@@ -135,6 +150,32 @@ sub then {
   $self->select($self->{transforms}->[-1]->selector);
 }
 
+sub AUTOLOAD {
+  my ($self, $selector, @args) = @_;
+  my $sel = $self->select($selector);
+  my $meth = our $AUTOLOAD;
+  $meth =~ s/.*:://;
+  if (ref($selector) eq 'HASH') {
+    my $ret = $self;
+    $ret = $ret->_do($_, $meth, @{$selector->{$_}}) for keys %$selector;
+    $ret;
+  } else {
+    $self->_do($selector, $meth, @args);
+  }
+}
+
+sub _do {
+  my ($self, $selector, $meth, @args) = @_;
+  my $sel = $self->select($selector);
+  if( my $cr = $sel->_zconfig->filter_builder->can($meth)) {
+    return $sel->$meth(@args);
+  } else {
+    die "We can't do $meth on ->select('$selector')";
+  }
+}
+
+sub DESTROY {}
+
 1;
 
 =head1 NAME
@@ -172,13 +213,14 @@ HTML::Zoom - selector based streaming template engine
             $_->select('.name')->replace_content('Matt')
               ->select('.age')->replace_content('26')
           },
+          # alternate form
           sub {
-            $_->select('.name')->replace_content('Mark')
-              ->select('.age')->replace_content('0x29')
+            $_->replace_content({'.name' => ['Mark'],'.age' => ['0x29'] })
           },
+          #alternate alternate form
           sub {
-            $_->select('.name')->replace_content('Epitaph')
-              ->select('.age')->replace_content('<redacted>')
+            $_->replace_content('.name' => 'Epitaph')
+              ->replace_content('.age' => '<redacted>')
           },
         ],
         { repeat_between => '.between' }
@@ -298,17 +340,15 @@ cleanly:
     map { my $field = $_; sub {
 
      $_->select('label')
-       ->add_attribute( for => $field->{id} )
+       ->add_to_attribute( for => $field->{id} )
        ->then
        ->replace_content( $field->{label} )
-
-       ->select('input')
-       ->add_attribute( name => $field->{name} )
-       ->then
-       ->add_attribute( type => $field->{type} )
-       ->then
-       ->add_attribute( value => $field->{value} )
-
+       ->add_to_attribute(
+        input => { 
+         name => $field->{name},
+         type => $field->{type},
+         value => $field->{value}
+       })
     } } @fields
   ]);
 
@@ -603,6 +643,12 @@ zoom instance with that as the source HTML to be transformed.
 
 Convenience method - slurps the contents of $file and calls from_html with it.
 
+=head2 from_events
+
+  my $zoom = HTML::Zoom->from_events($evt);
+
+Create a new Zoom object from collected events
+
 =head2 to_stream
 
   my $stream = $zoom->to_stream;
@@ -651,6 +697,14 @@ sugar, the following is entirely equivalent:
 
   my $z2 = $sub->($z1);
 
+=head2 apply_if
+
+  my $z2 = $z1->apply_if($cond, sub {
+    $_->select('div')->replace_content('I AM A DIV!') })
+  });
+
+->apply but will only run the tranform if $cond is true
+
 =head2 to_html
 
   my $html = $zoom->to_html;
@@ -696,20 +750,51 @@ together; the intermediary object isn't designed or expected to stick around.
 
 =head2 then
 
-  my $z2 = $z1->select('div')->add_attribute(class => 'spoon')
+  my $z2 = $z1->select('div')->add_to_attribute(class => 'spoon')
                              ->then
                              ->replace_content('I AM A DIV!');
 
 Re-runs the previous select to allow you to chain actions together on the
 same selector.
 
-=head1 AUTHORS
+=head1 AUTOLOAD METHODS
 
-=over
+L<HTML::Zoom> AUTOLOADS methods against L</select> so that you can reduce a
+certain amount of boilerplate typing.  This allows you to replace:
 
-=item * Matt S. Trout
+  $z->select('div')->replace_content("Hello World");
+  
+With:
 
-=back
+  $z->replace_content(div => "Hello World");
+  
+Besides saving a few keys per invocations, you may feel this looks neater
+in your code and increases understanding.
+
+=head1 AUTHOR
+
+mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
+
+=head1 CONTRIBUTORS
+
+Oliver Charles
+
+Jakub Nareski
+
+Simon Elliott
+
+Joe Highton
+
+John Napiorkowski
+
+Robert Buels
+
+David Dorward
+
+=head1 COPYRIGHT
+
+Copyright (c) 2010-2011 the HTML::Zoom L</AUTHOR> and L</CONTRIBUTORS>
+as listed above.
 
 =head1 LICENSE