code: func (e *Engine) ExecuteWriter(out io.Writer, name string, binding interface{}, options ...map[string]interface{}) error {
  
  	isLayout := false
  
  	layout := e.Config.Layout
  	renderFilename := name
  	if len(options) > 0 {
  		layoutOpt := options[0]["layout"]
  		if layoutOpt != nil {
  			if l, ok := layoutOpt.(string); ok {
  				if l != "" {
  					layout = l
  				}
  			}
  		}
  	}
  
  	if layout != "" && layout != NoLayout {
  		isLayout = true
  		renderFilename = layout // the render becomes the layout, and the name is the partial.
  	}
  
  	if tmpl := e.fromCache(renderFilename); tmpl != nil {
  		if isLayout {
  			var context map[string]interface{}
  			if m, is := binding.(map[string]interface{}); is { //handlebars accepts maps,
  				context = m
  			} else {
  				return fmt.Errorf("Please provide a map[string]interface{} type as the binding instead of the %#v", binding)
  			}
  
  			contents, err := e.executeTemplateBuf(name, binding)
  			if err != nil {
  				return err
  			}
  			if context == nil {
  				context = make(map[string]interface{}, 1)
  			}
  			// I'm implemented the {{ yield }} as with the rest of template engines, so this is not inneed for iris, but the user can do that manually if want
  			// there is no performanrce different: raymond.RegisterPartialTemplate(name, tmpl)
  			context["yield"] = raymond.SafeString(contents)
  		}
  
  		res, err := tmpl.Exec(binding)
  
  		if err != nil {
  			return err
  		}
  		_, err = fmt.Fprint(out, res)
  		return err
  	}
  
  	return fmt.Errorf("[IRIS TEMPLATES] Template with name %s[original name = %s] doesn't exists in the dir", renderFilename, name)
  }
docs: // ExecuteWriter executes a templates and write its results to the out writer