HTML::Template currently supports 4 formats for the input file, with three
different APIs
to specify it:
First:
new( filename => $f, ... );
new( scalarref => $f, ... );
new( arrayref => $f, ... );
new( filehandle => $f, ... );
Second:
new_file($f, ... );
new_scalar_ref($f, ... );
new_array_ref($f, ... );
new_filehandle($f, ... );
Third:
new(type => 'filename' , source => $f, ...);
new(type => 'scalarref' , source => $f, ...);
new(type => 'arrayref' , source => $f, ...);
new(type => 'filehandle', source => $f, ...);
###
I find these more verbose and confusing than it needs to be. Beecause the
second option provides alternate spellings for 3 out of 4 options, it's hard to
ever get the spelling right without consulting the docs.
I would like to contribute a patch that cleans all this up to this:
new(source => $filehandle);
new(source => $filename);
new(source => $scalarref);
new(source => $arrayref);
Since we can detect the difference between a string, a scalarref, an arrayref
and a filehandle, we don't need to user to repeat this information for us. It
can "just work". The auto-detection logic would come into play if "source" is
specified, but 'type' is not.
HTML::FillInForm had a similar interface and is a precendent for this kind of
API overhaul.
You can see their old API:
http://search.cpan.org/~tjmather/HTML-FillInForm-2.00/lib/HTML/FillInForm.pm#Old_syntax
And the new API:
http://search.cpan.org/~tjmather/HTML-FillInForm-2.00/lib/HTML/FillInForm.pm#SYNOPSIS
The attach patch includes working code and tests which head in this direction,
but it is not complete. (The current patch auto-detects the first arg, instead
of
the value for 'source').
The final patch would update the docs to highlight the simpler new syntax and
de-emphasize the other interfaces (The same approach used by HTML::FillInForm).
This would simplify things for new users, while users migrating from older
versions would still find the reference docs for the older APIs.
Before proceeding further, I wanted to get some feedback about heading in this
direction.
Mark
--
http://mark.stosberg.com/blog/
Sun Nov 30 18:42:57 EST 2008 Mark Stosberg <[EMAIL PROTECTED]>
* Add auto-detection for 3 out of 4 possible file types
diff -rN -u old-HTML-Template-2.9/t/11-non-file-templates.t new-HTML-Template-2.9/t/11-non-file-templates.t
--- old-HTML-Template-2.9/t/11-non-file-templates.t 2008-11-30 18:43:31.000000000 -0500
+++ new-HTML-Template-2.9/t/11-non-file-templates.t 2008-11-30 18:43:31.000000000 -0500
@@ -5,7 +5,9 @@
my ($output, $template, $result);
my ($fh, $template_string, @template_array,
- $stemplate, $atemplate, $ftemplate, $fhtemplate, $typetemplate);
+ $stemplate, $atemplate, $fhtemplate,
+ $shortcut_stemplate, $shortcut_atemplate, $shortcut_fhtemplate,
+ $ftemplate, $typetemplate);
$template = HTML::Template->new(
path => 'templates',
@@ -28,11 +30,16 @@
\$template_string,
debug => 0
);
+$shortcut_stemplate = HTML::Template->new( \$template_string, debug => 0);
$atemplate = HTML::Template->new_array_ref(
[EMAIL PROTECTED],
debug => 0
);
+$shortcut_atemplate = HTML::Template->new(
+ [EMAIL PROTECTED],
+ debug => 0
+);
$ftemplate = HTML::Template->new_file(
'simple.tmpl',
@@ -44,6 +51,12 @@
$fh,
debug => 0
);
+seek $fh, 0, 0;
+
+$shortcut_fhtemplate = HTML::Template->new(
+ $fh,
+ debug => 0
+);
$typetemplate = HTML::Template->new(
type => 'filename',
@@ -52,8 +65,13 @@
debug => 0
);
-for my $t ($template, $stemplate, $atemplate, $ftemplate,
- $fhtemplate, $typetemplate) {
+for my $t (
+ $template, $stemplate, $atemplate, $ftemplate,
+ $fhtemplate, $typetemplate,
+ $shortcut_stemplate, $shortcut_atemplate,
+ $shortcut_fhtemplate,
+ ) {
+
$t->param('ADJECTIVE', 'very');
$output = $t->output;
ok( ( $output !~ /ADJECTIVE/ and $t->param('ADJECTIVE') eq 'very' ),
diff -rN -u old-HTML-Template-2.9/Template.pm new-HTML-Template-2.9/Template.pm
--- old-HTML-Template-2.9/Template.pm 2008-11-30 18:43:31.000000000 -0500
+++ new-HTML-Template-2.9/Template.pm 2008-11-30 18:43:31.000000000 -0500
@@ -981,6 +981,11 @@
case_sensitive => 0,
filter => [],
);
+
+ # If the first arg to new turns out to a shortcut,
+ # convert it to the more verbose option
+ my $extra = _process_shortcuts_to_new($_[0]);
+ unshift @_, $extra if $extra;
# load in options supplied to new()
$options = _load_supplied_options( [EMAIL PROTECTED], $options);
@@ -3018,6 +3023,18 @@
values(%{$obj->[HTML::Template::LOOP::TEMPLATE_HASH]});
}
+sub _process_shortcuts_to_new {
+ my $first_arg = shift;
+
+ my %refs = (
+ 'SCALAR' => 'scalarref',
+ 'ARRAY' => 'arrayref',
+ 'GLOB' => 'filehandle',
+ );
+
+ return $refs{ref $first_arg};
+}
+
# HTML::Template::VAR, LOOP, etc are *light* objects - their internal
# spec is used above. No encapsulation or information hiding is to be
# assumed.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Html-template-users mailing list
Html-template-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/html-template-users