Actually, I've discovered my solution above is *wrong*...
in reply to The Power of Objects
The problem is it's entirely reasonable to call a template without calling param(), eg.
Furthermore, param() is called a lot of times internally, behaving differently based on parameter types passed, so it's not trivial to override it.
my $tmpl = HTML::Template->new( filename => 'template.html' );
In the end, I settled on overriding output(), and calling param() from there, setting the variables I needed. I don't think this changes the main point of my post, but I suppose I should use an example that actually works :)