Add Fragment.executeTemplate().

Allows a lambda to execute a template in the lambda's own context. This enables
'late bound' template inclusion where the lambda can select a template based on
dynamic data in the context at the time it is executed.

Closes #92.
This commit is contained in:
Michael Bayne
2017-12-03 18:26:45 -08:00
parent 2a270dcdbe
commit 02f917e2f7
2 changed files with 30 additions and 0 deletions
@@ -47,6 +47,13 @@ public class Template
* provided context will be nested in the fragment's bound context. */
public abstract void execute (Object context, Writer out);
/** Executes {@code tmpl} using this fragment's bound context. This allows a lambda to
* resolve its fragment to a dynamically loaded template and then run that template with
* the same context as the lamda, allowing a lambda to act as a 'late bound' included
* template, i.e. you can decide which template to include based on information in the
* context. */
public abstract void executeTemplate (Template tmpl, Writer out);
/** Executes this fragment and returns its result as a string. */
public String execute () {
StringWriter out = new StringWriter();
@@ -159,6 +166,9 @@ public class Template
@Override public void execute (Object context, Writer out) {
execute(currentCtx.nest(context), out);
}
@Override public void executeTemplate (Template tmpl, Writer out) {
tmpl.executeSegs(currentCtx, out);
}
@Override public Object context () {
return currentCtx.data;
}