@Override
  public SelType call(String methodName, SelType[] args) {
    if (args.length == 1) {
      if ("withZone".equals(methodName)) {
        return new SelJodaDateTimeFormatter(
            val.withZone(((SelJodaDateTimeZone) args[0]).getInternalVal()));
      } else if ("parseDateTime".equals(methodName)) {
        switch (args[0].type()) {
          case STRING:
          case LONG:
            return SelJodaDateTime.of(val.parseDateTime(args[0].toString()));
        }
      } else if ("parseMillis".equals(methodName)) {
        return SelLong.of(val.parseMillis(((SelString) args[0]).getInternalVal()));
      } else if ("forPattern".equals(methodName)) {
        return new SelJodaDateTimeFormatter(
            DateTimeFormat.forPattern(((SelString) args[0]).getInternalVal()));
      } else if ("print".equals(methodName)) {
        switch (args[0].type()) {
          case LONG:
            return SelString.of(val.print(((SelLong) args[0]).longVal()));
          case DATETIME:
            return SelString.of(val.print(((SelJodaDateTime) args[0]).getInternalVal()));
        }
      }
    }
    throw new UnsupportedOperationException(
        type()
            + " DO NOT support calling method: "
            + methodName
            + " with args: "
            + Arrays.toString(args));
  }
@Test(expected = UnsupportedOperationException.class)
  public void testInvalidCallMethod() {
    one.call("invalid", new SelType[] {});
  }