docs: @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          boolean isProviderMethod = matchesJoynrProviderMethod(method);
          Method delegateToMethod = getMethodFromInterfaces(bean.getBeanClass(), method, isProviderMethod);
          Object delegate = createDelegateForMethod(method, isProviderMethod);
          Object result = null;
          try {
              if (isProviderMethod(method, delegateToMethod)) {
                  JoynrJeeMessageContext.getInstance().activate();
                  copyMessageCreatorInfo();
                  copyMessageContext();
              }
              JoynrException joynrException = null;
              try {
                  result = delegateToMethod.invoke(delegate, args);
              } catch (InvocationTargetException e) {
                  joynrException = getJoynrExceptionFromInvocationException(e);
              }
              if (delegate != this) {
                  AbstractDeferred deferred = createAndResolveOrRejectDeferred(method, result, joynrException);
                  Promise<AbstractDeferred> promiseResult = new Promise<>(deferred);
                  return promiseResult;
              }
          } finally {
              if (isProviderMethod(method, delegateToMethod)) {
                  JoynrJeeMessageContext.getInstance().deactivate();
              }
          }
          return result;
      }