intercept
fun intercept(className: String, methodName: String, params: List<String>? = null, tag: String? = null, onReturn: PatchExitCallback? = null, cb: PatchInterceptCallback): PatchHandle
As onEnter, but the callback decides: it may rewrite args, or skip the body and supply the return value. Pass onReturn to also observe what the body produced — read-only, and silent on a skipped call.
A method carries at most one writable patch, and installing one evicts observers on it too: a skipped body makes their firing depend on weave order. Give both sides a tag to override that.