@Override
		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
			// TODO: Cache handles or pre-load them
			Object result;
			if (method.getDeclaringClass().isAssignableFrom(delegate.getClass())) {
				MethodHandle handle = lookup.unreflect(method);
				result = handle.bindTo(delegate).invokeWithArguments(args);
			}
			else if (!method.isDefault()) {
				throw new IllegalStateException(
					"Delegate must implement abstract methods from all mixins. Missed: " + method);
			}
			else {
				MethodHandle mh = getSuperMethodHandle(method, lookup);
				result = mh.bindTo(proxy).invokeWithArguments(args);
			}
			/**
			 * NOTE: I cannot replace the delegate with the proxy here (say, to prevent accidental
			 * leakage) for at least two reasons. 1) I may want direct access to the delegate. 2) It
			 * wouldn't work when the return value itself wraps or will provide the delegate (e.g.,
			 * a future).
			 */
			return result;
		}
Mix-in interfaces with default methods atop the given delegate.

Where both the delegate and a mixin provide an implementation, the delegate's is preferred.

@param <T> the delegate's and proxy's type
@param <U> a super interface common to all mixins
@param iface an interface of the delegate that also defines the proxy's type
@param delegate the delegate, providing implementations of all abstract methods
@param mixins the mixins
@param lookup a lookup which has access to the interfaces and their methods
Ghidra/Debug/ProposedUtils/src/main/java/utilities/util/ProxyUtilities.java