docs: public static Object invokeMethodOnCurrentN(Class senderClass, GroovyObject receiver, String messageName, Object[] messageArguments) throws Throwable {
          Object result = null;
          boolean intercepting = receiver instanceof GroovyInterceptable;
          try {
              try {
                  // if it's a pure interceptable object (even intercepting toString(), clone(), ...)
                  if (intercepting) {
                      result = receiver.invokeMethod(messageName, messageArguments);
                  }
                  //else if there's a statically typed method or a GDK method
                  else {
                      result = receiver.getMetaClass().invokeMethod(senderClass, receiver, messageName, messageArguments, false, true);
                  }
              } catch (MissingMethodException e) {
                  if (e instanceof MissingMethodExecutionFailed) {
                      throw (MissingMethodException)e.getCause();
                  } else if (!intercepting && receiver.getClass() == e.getType() && e.getMethod().equals(messageName)) {
                      // in case there's nothing else, invoke the object's own invokeMethod()
                      result = receiver.invokeMethod(messageName, messageArguments);
                  } else {
                      throw e;
                  }
              }
          } catch (GroovyRuntimeException gre) {
              throw unwrap(gre);
          }
          return result;
      }