Subject: | [PATCH] add a STRICT option |
I've started using Dist::Zilla. It uses Text::Template. I wanted to
turn on strict in my templates for the same reason I do it in my
scripts: to help catch typos.
The problem is that PREPEND => 'use strict;' is not adequate, because it
doesn't let you use any variables that come from the HASH parameter.
I think what is needed is a STRICT => 1 option. This would be roughly
equivalent to
PREPEND => 'use strict; use vars (All_Vars_Defined_in_HASH);'
but it would come before any PREPEND string, so you could use both
STRICT and PREPEND in the same template. If you don't have a HASH, then
it just prepends 'use strict;'.
You could also have an always_strict class method, but that's not essential.
The attached patch adds the STRICT option as described above. I've also
included the patch with Dist-Zilla-PluginBundle-CJM-0.03.
Subject: | Template_strict.patch |
This patch for Text::Template 1.45 adds support for the STRICT option.
This automatically prepends 'use strict' to your template code, but
still allows you to use variables defined by the HASH option.
--- lib/Text/Template.pm 2008-04-16 18:38:08.000000000 -0500
+++ lib/Text/Template.pm 2010-03-12 12:21:31.416024029 -0600
@@ -255,6 +255,7 @@
my $fi_eval_package;
my $fi_scrub_package = 0;
my $fi_filename = _param('filename') || $fi_self->{FILENAME} || 'template';
+ my $fi_strict = _param('strict', %fi_a);
my $fi_prepend = _param('prepend', %fi_a);
unless (defined $fi_prepend) {
@@ -272,6 +273,7 @@
$fi_eval_package = caller;
}
+ my @fi_varlist;
my $fi_install_package;
if (defined $fi_varhash) {
if (defined $fi_package) {
@@ -281,7 +283,12 @@
} else {
$fi_install_package = $fi_eval_package; # The gensymmed one
}
- _install_hash($fi_varhash => $fi_install_package);
+ @fi_varlist = _install_hash($fi_varhash => $fi_install_package);
+ }
+
+ if ($fi_strict) {
+ $fi_prepend = "use vars qw(@fi_varlist);$fi_prepend" if @fi_varlist;
+ $fi_prepend = "use strict;$fi_prepend";
}
if (defined $fi_package && defined $fi_safe) {
@@ -441,6 +448,7 @@
$hashlist = [$hashlist];
}
my $hash;
+ my @varlist;
foreach $hash (@$hashlist) {
my $name;
foreach $name (keys %$hash) {
@@ -449,13 +457,23 @@
local *SYM = *{"$ {dest}::$name"};
if (! defined $val) {
delete ${"$ {dest}::"}{$name};
+ my $match = qr/^.\Q$name\E$/;
+ @varlist = grep { $_ !~ $match } @varlist;
} elsif (ref $val) {
*SYM = $val;
+ push @varlist, do {
+ if (UNIVERSAL::isa($val, 'ARRAY')) { '@' }
+ elsif (UNIVERSAL::isa($val, 'HASH')) { '%' }
+ else { '$' }
+ } . $name;
} else {
*SYM = \$val;
+ push @varlist, '$' . $name;
}
}
}
+
+ @varlist;
}
sub TTerror { $ERROR }