When faced with a similar problem, I found the best approach was to ask the template for a list of all variables it was going to use, pull in just those values to a hashref, then display the template with that hashref. For an SQL backend, this mostly meant adding in the right tables and columns to a
SELECT statement.
This was using custom template code; not sure whether your system will allow this or not, but it seems like pretty basic functionality.
As for the popularity of the hashref approach, I think it's intuitive, and it's also quite hard to screw up from a security perspective. It seems like callbacks would be much harder to get right in this way; it seems like a small mistake or oversight on the part of the template code's author could easily let the template call arbitrary code.