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.009005';
+
+$VERSION = eval $VERSION;
sub new {
my ($class, $args) = @_;
$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);
$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
$_->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' }
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
]);
=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
+
+=head1 COPYRIGHT
+
+Copyright (c) 2010-2011 the HTML::Zoom L</AUTHOR> and L</CONTRIBUTORS>
+as listed above.
=head1 LICENSE