@Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if ("findColumn".equals(method.getName())) {
      return findColumn((String) args[0]);
    }

    if (isFirstArgColumnLabel(method, args)) {
      try {
        final Integer columnIndex = findColumn((String) args[0]);
        return invokeMethod(
            locateCorrespondingColumnIndexMethod(method),
            buildColumnIndexMethodArgs(args, columnIndex));
      } catch (SQLException ex) {
        final String msg =
            "Exception getting column index for column: ["
                + args[0]
                + "].\nReverting to using: ["
                + args[0]
                + "] as first argument for method: ["
                + method
                + "]";
        SQL_EXCEPTION_HELPER.logExceptions(ex, msg);
      } catch (NoSuchMethodException ex) {
        LOG.unableToSwitchToMethodUsingColumnIndex(method);
      }
    }
    return invokeMethod(method, args);
  }