code: @Override
      public Template createTemplate(final Reader reader) throws CompilationFailedException, ClassNotFoundException, IOException {
          return new StreamingTemplate(reader, parentLoader);
      }
docs: Creates a template instance using the template source from the provided Reader.
  
  The template can be applied repeatedly on different bindings to produce custom output.
  
  <strong>Technical detail</strong><br />
  Under the hood the returned template is represented as a four argument
  closure where the three first arguments are {@link groovy.lang.Closure#curry curried} in
  while generating the template. <br />
  <br />
  In essence we start with a closure on the form:
  
  <pre>
  { parentClass, stringSectionList, binding, out {@code ->}
  //code generated by parsing the template data
  }
  </pre>
  
  We then curry in the parentClass and stringSectionList arguments so that the StreamingTemplate
  instance returned from 'createTemplate' internally contains a template closure on the form:
  
  <pre>
  { binding, out {@code ->}
  //code generated by parsing the template data
  }
  </pre>
  
  Calling {@code template.make(binding)}, curries in the 'binding' argument:
  
  <pre>
  public Writable make(final Map map) {
  final Closure template = this.template.curry(new Object[]{map});
  return (Writable) template;
  }
  </pre>
  
  This only leaves the 'out' argument unbound. The only method on the {@link groovy.lang.Writable writable} interface is
  {@link groovy.lang.Writable#writeTo writeTo(Writer out)} so groovy rules about casting a closure to a one-method-interface
  apply and the above works. I.e. we return the now one argument closure as the Writable
  which can be serialized to System.out, a file, etc according to the Writable interface contract.
  
  @see groovy.text.TemplateEngine#createTemplate(java.io.Reader)