Template Toolkit's DEFAULT directive does not short-circuit
Template Toolkit’s DEFAULT does not do short-circuit evaluation like you might think it would. If you have
[% DEFAULT foo = user.calculate_foo; %]
Then the results of the method call user.calculate_foo
are assigned to foo
, unless foo
already has a true value.
However, whether or not foo already has a true value, user.calculcate_foo
is always invoked.
You might expect the code to look like this:
$foo = $user->calculate_foo() unless $foo;
But it’s really like this;
$temp = $user->calculate_foo();
$foo = $temp unless $foo;
So, if user.calculate_foo
is an expensive function that you don’t want to invoke unless you have to, you’ll have to
resort to an explicit IF
block:
IF !foo;
foo = user.calculate_foo;
END
It’s also worth noting that DEFAULT
is not for checking if a variable is set, but for checking if it is true.