@Override
  public Object exec(List args) throws TemplateModelException {
    // old way: resourcePath = FreemarkerUtil.getDataModel("_r.pathInfo",String.class);
    RequestContext rc = FreemarkerUtil.getDataModel("_r.rc", RequestContext.class);
    String resourcePath = rc.getResourcePath();

    String pathInfoMatch = FreemarkerUtil.getParamAs(args.get(0), String.class);

    /*--------- Get the eventual true/false values ---------*/
    String trueValue = null;
    String falseValue = null;
    if (args.size() > 1) {
      trueValue = FreemarkerUtil.getParamAs(args.get(1), String.class);
      falseValue = ""; // by default the false value will be empty
    }

    if (args.size() > 2) {
      falseValue = FreemarkerUtil.getParamAs(args.get(2), String.class);
    }
    /*--------- /Get the eventual true/false values ---------*/

    /*--------- Match the string ---------*/
    boolean match = false;
    switch (mode) {
      case IS:
        if (resourcePath.equals(pathInfoMatch)) {
          match = true;
        }
        break;
      case STARTS_WITH:
        if (resourcePath.startsWith(pathInfoMatch)) {
          match = true;
        }
        break;
    }
    /*--------- /Match the string ---------*/

    /*--------- Return the value ---------*/
    if (trueValue != null) {
      return match ? trueValue : falseValue;
    } else {
      return match;
    }
  }
  @Override
  public Object invoke(MethodInvocation methodInvocation) throws Throwable {
    Object result;

    String name =
        methodInvocation.getMethod().getDeclaringClass().getSimpleName()
            + "."
            + methodInvocation.getMethod().getName();

    RequestContext rc = (crch != null) ? crch.getCurrentRequestContext() : null;
    RcPerf rcPerf = (rc != null) ? rc.getData(RcPerf.class) : null;

    PerfContext requestPerfContext = (rcPerf != null) ? rcPerf.start(name) : null;
    PerfContext methodPerfContext = (perfManager != null) ? perfManager.startMethod(name) : null;
    try {
      result = methodInvocation.proceed();
    } finally {
      if (methodPerfContext != null) methodPerfContext.end();
      if (requestPerfContext != null) requestPerfContext.end();
    }
    return result;
  }