code: @Override
      public void render(final String file, final Map<String, Object> context, final Handler<AsyncResult<Buffer>> handler) {
          // verify if the file is still fresh in the cache
          read(prefix + file, new AsyncResultHandler<String>() {
              @Override
              public void handle(AsyncResult<String> asyncResult) {
                  if (asyncResult.failed()) {
                      handler.handle(new YokeAsyncResult<Buffer>(asyncResult.cause()));
                  } else {
                      try {
                          handler.handle(new YokeAsyncResult<>(parseStringValue(asyncResult.result(), context, new HashSet<String>())));
                      } catch (IllegalArgumentException iae) {
                          handler.handle(new YokeAsyncResult<Buffer>(iae));
                      }
                  }
              }
          });
      }
docs: An interpreter for strings with named placeholders.
  
  For example given the string "hello ${myName}" and the map <code>
  Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();
  map.put("myName", "world");
  </code>
  
  the call returns "hello world"
  
  It replaces every occurrence of a named placeholder with its given value
  in the map. If there is a named place holder which is not found in the
  map then the string will retain that placeholder. Likewise, if there is
  an entry in the map that does not have its respective placeholder, it is
  ignored.