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;
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;
--- /dev/null
+use strictures 1;
+use Test::More skip_all => 'TODO test';
+
+use HTML::Zoom;
+
+my $tmpl = <<END;
+<body>
+ <input class="main"/>
+</body>
+END
+
+my $tmpl2 = <<END;
+<body>
+ <div>cluck</div><input class="main"/>
+</body>
+END
+
+my $z = HTML::Zoom->from_html($tmpl);
+
+my $count = 0;
+$z->select('input')->collect({
+ filter => sub { $count++; $_ },
+ passthrough => 1,
+})->run;
+
+is($count, 1,"collect on void");
+
+is(
+ $z->select('input')
+ ->add_before(\"<div>cluck</div>")
+ ->to_html, $tmpl2,
+"added before void");
+
+done_testing;
'<div frew="yo">grg</div>'.$stub,
'E[attr=val] works' );
+{
+ local $TODO = 'mixed-case attribute names are broken';
+ # el[Attr=foo]
+ is( HTML::Zoom->from_html('<div FreW="yo"></div>'.$stub)
+ ->select('div[FreW=yo]')
+ ->replace_content('grg')
+ ->to_html,
+ '<div FreW="yo">grg</div>'.$stub,
+ 'E[attr=val] works with mixed-case attribute names' );
+}
+
# el[attr=foo\.bar]
is( HTML::Zoom->from_html('<div frew="yo.yo"></div>'.$stub)
->select('div[frew=yo\.yo]')