This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/main by this push:
     new 7088d8c4bdb CAUSEWAY-3883: simplifies WrappingObject
7088d8c4bdb is described below

commit 7088d8c4bdba7892a4373618348167477d04f3d9
Author: Andi Huber <[email protected]>
AuthorDate: Wed Jun 18 14:49:49 2025 +0200

    CAUSEWAY-3883: simplifies WrappingObject
---
 .../applib/services/wrapper/WrappingObject.java    | 13 +--
 .../runtime/wrap/WrapperInvocationHandler.java     | 52 +++++++++---
 .../wrapper/WrapperFactoryDefault.java             | 10 +--
 .../handlers/DomainObjectInvocationHandler.java    | 93 ++++++----------------
 .../wrapper/handlers/PluralInvocationHandler.java  |  2 +-
 .../wrapper/handlers/ProxyGenerator.java           | 27 ++-----
 .../wrapper/WrapperFactoryDefaultTest.java         | 12 +--
 .../ProxyCreatorTestUsingCodegenPlugin.java        |  2 +-
 8 files changed, 83 insertions(+), 128 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/WrappingObject.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/WrappingObject.java
index f5a1827c0f4..e359df42488 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/WrappingObject.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/wrapper/WrappingObject.java
@@ -21,9 +21,7 @@
 import java.lang.reflect.Modifier;
 import java.util.List;
 
-import org.apache.causeway.applib.services.wrapper.control.ExecutionMode;
 import org.apache.causeway.applib.services.wrapper.control.SyncControl;
-import org.apache.causeway.commons.collections.ImmutableEnumSet;
 import 
org.apache.causeway.commons.internal.proxy._ProxyFactoryService.AdditionalField;
 import org.apache.causeway.commons.internal.reflection._Reflect;
 
@@ -45,7 +43,7 @@ public interface WrappingObject {
     final static String ORIGIN_GETTER_NAME = "__causeway_origin";
     final static String ORIGIN_FIELD_NAME = "__causeway_origin_field";
     final static String SAVE_METHOD_NAME = "__causeway_save";
-    final static String EXECUTION_MODES_METHOD_NAME = 
"__causeway_executionModes";
+    
     final static List<AdditionalField> ADDITIONAL_FIELDS = List.of(
             new AdditionalField(ORIGIN_FIELD_NAME, 
WrappingObject.Origin.class, Modifier.PROTECTED));
     
@@ -87,13 +85,4 @@ static <T> T withOrigin(T proxyObject, Origin origin) {
      */
     void __causeway_save();
 
-    /**
-     * The {@link ExecutionMode}(s) inferred from the
-     * {@link SyncControl} with which this wrapper was
-     * {@link WrapperFactory#wrap(Object, SyncControl) created}.
-     */
-    ImmutableEnumSet<ExecutionMode> __causeway_executionModes();
-
-
-
 }
diff --git 
a/core/runtime/src/main/java/org/apache/causeway/core/runtime/wrap/WrapperInvocationHandler.java
 
b/core/runtime/src/main/java/org/apache/causeway/core/runtime/wrap/WrapperInvocationHandler.java
index 92f9f6cf450..be33af23eb5 100644
--- 
a/core/runtime/src/main/java/org/apache/causeway/core/runtime/wrap/WrapperInvocationHandler.java
+++ 
b/core/runtime/src/main/java/org/apache/causeway/core/runtime/wrap/WrapperInvocationHandler.java
@@ -23,10 +23,12 @@
 import java.util.Objects;
 
 import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.services.wrapper.WrappingObject;
 import org.apache.causeway.applib.services.wrapper.control.ExecutionMode;
 import org.apache.causeway.commons.internal._Constants;
+import org.apache.causeway.commons.internal.base._Lazy;
 
 public interface WrapperInvocationHandler extends InvocationHandler {
     
@@ -45,19 +47,40 @@ public record ClassMetaData(
 
             Method equalsMethod,
             Method hashCodeMethod,
-            Method toStringMethod) {
+            Method toStringMethod,
+            
+            /**
+             * The <tt>title()</tt> method; may be <tt>null</tt>.
+             */
+            @Nullable Method titleMethod) {
+        
+        /**
+         * The <tt>__causeway_origin()</tt> method from {@link 
WrappingObject#__causeway_origin()}.
+         */
+        static final _Lazy<Method> __causeway_originMethod = 
_Lazy.threadSafe(()-> 
+                
WrappingObject.class.getMethod(WrappingObject.ORIGIN_GETTER_NAME, 
_Constants.emptyClasses));
+        
+        /**
+         * The <tt>__causeway_save()</tt> method from {@link 
WrappingObject#__causeway_save()}.
+         */
+        static final _Lazy<Method> __causeway_saveMethod = 
_Lazy.threadSafe(()->
+                
WrappingObject.class.getMethod(WrappingObject.SAVE_METHOD_NAME, 
_Constants.emptyClasses));
         
         public static ClassMetaData of(
-                final @NonNull Object pojo) {
-
-            var pojoClass = pojo.getClass();
+                final @NonNull Class<?> pojoClass) {
             try {
                 var equalsMethod = pojoClass.getMethod("equals", 
_Constants.classesOfObject);
                 var hashCodeMethod = pojoClass.getMethod("hashCode", 
_Constants.emptyClasses);
                 var toStringMethod = pojoClass.getMethod("toString", 
_Constants.emptyClasses);
                 
+                var titleMethod = (Method)null;
+                try {
+                    titleMethod = pojoClass.getMethod("title", 
_Constants.emptyClasses);
+                } catch (final NoSuchMethodException e) {
+                    // ignore
+                }
                 return new WrapperInvocationHandler
-                        .ClassMetaData(pojoClass, equalsMethod, 
hashCodeMethod, toStringMethod);
+                        .ClassMetaData(pojoClass, equalsMethod, 
hashCodeMethod, toStringMethod, titleMethod);
                 
             } catch (final NoSuchMethodException e) {
                 // ///CLOVER:OFF
@@ -71,20 +94,29 @@ public boolean isObjectMethod(final Method method) {
                     || hashCodeMethod().equals(method) 
                     || equalsMethod().equals(method);
         }
-        
+
+        public boolean isTitleMethod(Method method) {
+            return method.equals(titleMethod);
+        }
+        public boolean isOriginMethod(Method method) {
+            return method.equals(__causeway_originMethod.get());
+        }
+        public boolean isSaveMethod(Method method) {
+            return method.equals(__causeway_saveMethod.get());
+        }
     }
     
     public record WrapperInvocation(
-        WrappingObject.Origin origin,
-        Method method,
-        Object[] args) {
+        WrappingObject.@NonNull Origin origin,
+        @NonNull Method method,
+        @NonNull Object[] args) {
 
         static WrapperInvocation of(Object target, Method method, Object[] 
args) {
             Objects.requireNonNull(target);
             var origin = target instanceof WrappingObject wrappingObject 
                     ? WrappingObject.getOrigin(wrappingObject)
                     : WrappingObject.Origin.fallback(target);
-            return new WrapperInvocation(origin, method, args);
+            return new WrapperInvocation(origin, method, args!=null ? args : 
_Constants.emptyObjects);
         }
         
         public boolean shouldEnforceRules() {
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 1d591931312..4b939ff3754 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -197,8 +197,8 @@ public <T> T wrap(
 
         if (isWrapper(domainObject)) {
             var wrapperObject = (WrappingObject) domainObject;
-            var executionMode = wrapperObject.__causeway_executionModes();
-            if(equivalent(executionMode, syncControl.getExecutionModes())) {
+            var origin = wrapperObject.__causeway_origin();
+            if(equivalent(origin.syncControl().getExecutionModes(), 
syncControl.getExecutionModes())) {
                 return domainObject;
             }
             var underlyingDomainObject = 
wrapperObject.__causeway_origin().pojo();
@@ -233,12 +233,12 @@ public <T> T wrapMixin(
 
         if (isWrapper(mixee)) {
             var wrapperObject = (WrappingObject) mixee;
-            var executionMode = wrapperObject.__causeway_executionModes();
-            var underlyingMixee = wrapperObject.__causeway_origin().pojo();
+            var origin = wrapperObject.__causeway_origin();
+            var underlyingMixee = origin.pojo();
 
             getServiceInjector().injectServicesInto(underlyingMixee);
 
-            if(equivalent(executionMode, syncControl.getExecutionModes())) {
+            if(equivalent(origin.syncControl().getExecutionModes(), 
syncControl.getExecutionModes())) {
                 return mixin;
             }
             return _Casts.uncheckedCast(createMixinProxy(underlyingMixee, 
mixin, syncControl));
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index 89d576f1185..f6f6e9a4390 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -38,7 +38,7 @@
 import org.apache.causeway.applib.services.wrapper.events.VisibilityEvent;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.functional.IndexedFunction;
-import org.apache.causeway.commons.internal._Constants;
+import org.apache.causeway.commons.internal.assertions._Assert;
 import org.apache.causeway.commons.internal.base._Casts;
 import org.apache.causeway.commons.internal.base._NullSafe;
 import org.apache.causeway.commons.internal.collections._Arrays;
@@ -84,56 +84,19 @@ final class DomainObjectInvocationHandler<T>
     private final ProxyGenerator proxyGenerator;
     private final MetaModelContext mmc;
 
-    /**
-     * The <tt>title()</tt> method; may be <tt>null</tt>.
-     */
-    protected final Method titleMethod;
-
-    /**
-     * The <tt>__causeway_origin()</tt> method from {@link 
WrappingObject#__causeway_origin()}.
-     */
-    protected final Method __causeway_originMethod;
-    
-    /**
-     * The <tt>__causeway_save()</tt> method from {@link 
WrappingObject#__causeway_save()}.
-     */
-    protected final Method __causeway_saveMethod;
-
-    /**
-     * The <tt>__causeway_executionModes()</tt> method from {@link 
WrappingObject#__causeway_executionModes()}.
-     */
-    protected final Method __causeway_executionModes;
-
     private final EntityFacet entityFacet;
     private final ManagedObject mixeeAdapter;
 
-    public DomainObjectInvocationHandler(
-            final T domainObject,
+    DomainObjectInvocationHandler(
+            final Class<T> domainObjectClass,
             final ManagedObject mixeeAdapter, // ignored if not handling a 
mixin
             final ManagedObject targetAdapter,
             final ProxyGenerator proxyGenerator) {
         
         this.mmc = targetAdapter.objSpec().getMetaModelContext();
-        this.classMetaData = 
WrapperInvocationHandler.ClassMetaData.of(domainObject);
+        this.classMetaData = 
WrapperInvocationHandler.ClassMetaData.of(domainObjectClass);
         this.proxyGenerator = proxyGenerator;
 
-        var _titleMethod = (Method)null;
-        try {
-            _titleMethod = classMetaData().pojoClass().getMethod("title", 
_Constants.emptyClasses);
-        } catch (final NoSuchMethodException e) {
-            // ignore
-        }
-        this.titleMethod = _titleMethod;
-        
-        try {
-            this.__causeway_originMethod = 
WrappingObject.class.getMethod(WrappingObject.ORIGIN_GETTER_NAME, 
_Constants.emptyClasses);
-            this.__causeway_saveMethod = 
WrappingObject.class.getMethod(WrappingObject.SAVE_METHOD_NAME, 
_Constants.emptyClasses);
-            this.__causeway_executionModes = 
WrappingObject.class.getMethod(WrappingObject.EXECUTION_MODES_METHOD_NAME, 
_Constants.emptyClasses);
-        } catch (final NoSuchMethodException nsme) {
-            throw new IllegalStateException(
-                    "Could not locate reserved declared methods in the 
WrappingObject interfaces",
-                    nsme);
-        }
 
         this.entityFacet = targetAdapter.objSpec().entityFacet().orElse(null);
         this.mixeeAdapter = mixeeAdapter;
@@ -144,12 +107,10 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
     
         final Object target = wrapperInvocation.origin().pojo();
         final Method method = wrapperInvocation.method();
-        final Object[] args = wrapperInvocation.args();
-        var syncControl = wrapperInvocation.origin().syncControl();        
         
         if (classMetaData().isObjectMethod(method)
                 || isEnhancedEntityMethod(method)) {
-            return method.invoke(target, args);
+            return method.invoke(target, wrapperInvocation.args());
         }
 
         final ManagedObject targetAdapter = 
mmc.getObjectManager().adapt(target);
@@ -158,7 +119,7 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
             MmAssertionUtils.assertIsBookmarkSupported(targetAdapter);
         }
 
-        if (method.equals(titleMethod)) {
+        if (classMetaData.isTitleMethod(method) ) {
             return handleTitleMethod(wrapperInvocation, targetAdapter);
         }
 
@@ -167,19 +128,13 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
                 .orElseThrow();
 
         if(!wrapperInvocation.origin().isFallback()) {
-        
-            if (method.equals(__causeway_originMethod)) {
+            if (classMetaData.isOriginMethod(method)) {
                 return wrapperInvocation.origin();
             }
-            
             // save method, through the proxy
-            if (method.equals(__causeway_saveMethod)) {
+            if (classMetaData.isSaveMethod(method)) {
                 return handleSaveMethod(wrapperInvocation, targetAdapter, 
targetSpec);
             }
-    
-            if (method.equals(__causeway_executionModes)) {
-                return syncControl.getExecutionModes();
-            }
         }
 
         var objectMember = targetSpec.getMemberElseFail(resolvedMethod);
@@ -191,7 +146,7 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
         }
 
         if (intent == Intent.DEFAULTS || intent == 
Intent.CHOICES_OR_AUTOCOMPLETE) {
-            return method.invoke(target, args);
+            return method.invoke(target, wrapperInvocation.args());
         }
 
         if (objectMember.isOneToOneAssociation()) {
@@ -203,11 +158,11 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
             final OneToOneAssociation otoa = (OneToOneAssociation) 
objectMember;
 
             if (intent == Intent.ACCESSOR) {
-                return handleGetterMethodOnProperty(wrapperInvocation, 
targetAdapter, args, otoa);
+                return handleGetterMethodOnProperty(wrapperInvocation, 
targetAdapter, otoa);
             }
 
             if (intent == Intent.MODIFY_PROPERTY || intent == 
Intent.INITIALIZATION) {
-                return handleSetterMethodOnProperty(wrapperInvocation, 
targetAdapter, args, otoa);
+                return handleSetterMethodOnProperty(wrapperInvocation, 
targetAdapter, otoa);
             }
         }
         if (objectMember.isOneToManyAssociation()) {
@@ -218,7 +173,7 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
 
             final OneToManyAssociation otma = (OneToManyAssociation) 
objectMember;
             if (intent == Intent.ACCESSOR) {
-                return handleGetterMethodOnCollection(wrapperInvocation, 
targetAdapter, args, otma, memberId);
+                return handleGetterMethodOnCollection(wrapperInvocation, 
targetAdapter, otma, memberId);
             }
         }
 
@@ -242,13 +197,15 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
 
                 if (mixinMember != null) {
                     if(mixinMember instanceof ObjectAction) {
-                        return handleActionMethod(wrapperInvocation, 
mixeeAdapter, args, (ObjectAction)mixinMember);
+                        return handleActionMethod(wrapperInvocation, 
mixeeAdapter, (ObjectAction)mixinMember);
                     }
                     if(mixinMember instanceof OneToOneAssociation) {
-                        return handleGetterMethodOnProperty(wrapperInvocation, 
mixeeAdapter, new Object[0], (OneToOneAssociation)mixinMember);
+                        _Assert.assertEquals(0, 
wrapperInvocation.args().length);
+                        return handleGetterMethodOnProperty(wrapperInvocation, 
mixeeAdapter, (OneToOneAssociation)mixinMember);
                     }
                     if(mixinMember instanceof OneToManyAssociation) {
-                        return 
handleGetterMethodOnCollection(wrapperInvocation, mixeeAdapter, new Object[0], 
(OneToManyAssociation)mixinMember, memberId);
+                        _Assert.assertEquals(0, 
wrapperInvocation.args().length);
+                        return 
handleGetterMethodOnCollection(wrapperInvocation, mixeeAdapter, 
(OneToManyAssociation)mixinMember, memberId);
                     }
                 } else {
                     throw _Exceptions.illegalState(String.format(
@@ -257,7 +214,7 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
             }
 
             // this is just a regular non-mixin action.
-            return handleActionMethod(wrapperInvocation, targetAdapter, args, 
objectAction);
+            return handleActionMethod(wrapperInvocation, targetAdapter, 
objectAction);
         }
 
         throw new UnsupportedOperationException(String.format("Unknown member 
type '%s'", objectMember));
@@ -285,7 +242,7 @@ private static ObjectMember determineMixinMember(
         // throw new RuntimeException("Unable to find the mixed-in action 
corresponding to " + objectAction.getIdentifier().toFullIdentityString());
     }
 
-    public InteractionInitiatedBy getInteractionInitiatedBy(final 
WrapperInvocation wrapperInvocation) {
+    private InteractionInitiatedBy getInteractionInitiatedBy(final 
WrapperInvocation wrapperInvocation) {
         return wrapperInvocation.shouldEnforceRules()
                 ? InteractionInitiatedBy.USER
                 : InteractionInitiatedBy.FRAMEWORK;
@@ -334,10 +291,9 @@ private Object handleSaveMethod(
     private Object handleGetterMethodOnProperty(
             final WrapperInvocation wrapperInvocation,
             final ManagedObject targetAdapter,
-            final Object[] args,
             final OneToOneAssociation property) {
 
-        zeroArgsElseThrow(args, "get");
+        zeroArgsElseThrow(wrapperInvocation.args(), "get");
 
         runValidationTask(wrapperInvocation, ()->{
             checkVisibility(wrapperInvocation, targetAdapter, property);
@@ -363,10 +319,9 @@ private Object handleGetterMethodOnProperty(
     private Object handleSetterMethodOnProperty(
             final WrapperInvocation wrapperInvocation,
             final ManagedObject targetAdapter,
-            final Object[] args,
             final OneToOneAssociation property) {
 
-        var singleArg = singleArgUnderlyingElseNull(args, "setter");
+        var singleArg = singleArgUnderlyingElseNull(wrapperInvocation.args(), 
"setter");
 
         runValidationTask(wrapperInvocation, ()->{
             checkVisibility(wrapperInvocation, targetAdapter, property);
@@ -392,11 +347,10 @@ targetAdapter, argumentAdapter, 
getInteractionInitiatedBy(wrapperInvocation))
     private Object handleGetterMethodOnCollection(
             final WrapperInvocation wrapperInvocation,
             final ManagedObject targetAdapter,
-            final Object[] args,
             final OneToManyAssociation collection,
             final String memberId) {
 
-        zeroArgsElseThrow(args, "get");
+        zeroArgsElseThrow(wrapperInvocation.args(), "get");
 
         runValidationTask(wrapperInvocation, ()->{
             checkVisibility(wrapperInvocation, targetAdapter, collection);
@@ -454,7 +408,6 @@ private Collection<?> wrapCollection(
     private Object handleActionMethod(
             final WrapperInvocation wrapperInvocation,
             final ManagedObject targetAdapter,
-            final Object[] args,
             final ObjectAction objectAction) {
 
         var head = objectAction.interactionHead(targetAdapter);
@@ -463,7 +416,7 @@ private Object handleActionMethod(
         // adapt argument pojos to managed objects
         var argAdapters = 
objectAction.getParameterTypes().map(IndexedFunction.zeroBased((paramIndex, 
paramSpec)->{
             // guard against index out of bounds
-            var argPojo = _Arrays.get(args, paramIndex).orElse(null);
+            var argPojo = _Arrays.get(wrapperInvocation.args(), 
paramIndex).orElse(null);
             return argPojo!=null
                     ? objectManager.adapt(argPojo)
                     : ManagedObject.empty(paramSpec);
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/PluralInvocationHandler.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/PluralInvocationHandler.java
index 40904c94911..0863614c347 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/PluralInvocationHandler.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/PluralInvocationHandler.java
@@ -79,7 +79,7 @@ private PluralInvocationHandler(
             final CollectionSemantics collectionSemantics) {
         
         this(collectionOrMapToBeProxied, 
-                
WrapperInvocationHandler.ClassMetaData.of(collectionOrMapToBeProxied), 
+                
WrapperInvocationHandler.ClassMetaData.of(collectionOrMapToBeProxied.getClass()),
 
                 otma, collectionSemantics);
     }
 
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
index 259038c1d88..4103ee4fe58 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
@@ -18,7 +18,6 @@
  */
 package org.apache.causeway.core.runtimeservices.wrapper.handlers;
 
-import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 import java.util.Collection;
 import java.util.Map;
@@ -42,12 +41,7 @@ public <T> T objectProxy(
         final ManagedObject adapter,
         final SyncControl syncControl) {
 
-        var invocationHandler = new DomainObjectInvocationHandler<T>(
-            domainObject,
-            null, // mixeeAdapter ignored
-            adapter,
-            this);
-
+        var invocationHandler = handlerForRegular(domainObject, adapter);
         return instantiateProxy(invocationHandler, new 
WrappingObject.Origin(domainObject, syncControl));
     }
 
@@ -57,12 +51,7 @@ public <T> T mixinProxy(
             final ManagedObject mixinAdapter,
             final SyncControl syncControl) {
     
-        var invocationHandler = new DomainObjectInvocationHandler<T>(
-                mixin,
-                mixeeAdapter,
-                mixinAdapter,
-                this);
-    
+        var invocationHandler = handlerForMixin(mixin, mixeeAdapter, 
mixinAdapter);
         return instantiateProxy(invocationHandler, new 
WrappingObject.Origin(mixin, syncControl));
     }
     
@@ -126,20 +115,20 @@ private <T, P> P instantiatePluralProxy(final Class<T> 
base, final PluralInvocat
         return _Casts.uncheckedCast(proxyWithoutFields);
     }
 
-    public <T> InvocationHandler handlerForRegular(@NonNull T domainObject, 
ManagedObject targetAdapter) {
+    public <T> WrapperInvocationHandler handlerForRegular(@NonNull T 
domainObject, ManagedObject targetAdapter) {
         return new DomainObjectInvocationHandler<>(
-                domainObject,
+                domainObject.getClass(),
                 null, // mixeeAdapter ignored
                 targetAdapter,
-                null);
+                this);
     }
 
-    public <T> InvocationHandler handlerForMixin(T mixin, ManagedObject 
mixeeAdapter, ManagedObject mixinAdapter) {
+    public <T> WrapperInvocationHandler handlerForMixin(T mixin, ManagedObject 
mixeeAdapter, ManagedObject mixinAdapter) {
         return new DomainObjectInvocationHandler<>(
-                mixin,
+                mixin.getClass(),
                 mixeeAdapter,
                 mixinAdapter,
-                null);
+                this);
     }
     
 }
diff --git 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefaultTest.java
 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefaultTest.java
index 3534620326a..6f8ef3e6140 100644
--- 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefaultTest.java
+++ 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefaultTest.java
@@ -31,7 +31,6 @@
 import org.apache.causeway.applib.services.wrapper.WrappingObject;
 import org.apache.causeway.applib.services.wrapper.control.ExecutionMode;
 import org.apache.causeway.applib.services.wrapper.control.SyncControl;
-import org.apache.causeway.commons.collections.ImmutableEnumSet;
 import org.apache.causeway.commons.internal.proxy._ProxyFactoryService;
 import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.causeway.core.metamodel.execution.MemberExecutorService;
@@ -45,9 +44,7 @@ private static class DomainObject {
 
     @RequiredArgsConstructor
     private static class WrappingDomainObject extends DomainObject implements 
WrappingObject {
-
         private final DomainObject wrappedObject;
-        private final ImmutableEnumSet<ExecutionMode> modes;
 
         @Override
         public void __causeway_save() {
@@ -57,11 +54,6 @@ public void __causeway_save() {
         public WrappingObject.Origin __causeway_origin() {
             return new WrappingObject.Origin(wrappedObject, 
SyncControl.control());
         }
-
-        @Override
-        public ImmutableEnumSet<ExecutionMode> __causeway_executionModes() {
-            return modes;
-        }
     }
 
     private WrapperFactoryDefault wrapperFactory;
@@ -110,7 +102,7 @@ public void wrap_ofUnwrapped_delegates_to_createProxy() 
throws Exception {
     public void wrap_ofWrapped_sameMode_returnsUnchanged() throws Exception {
         // given
         final DomainObject wrappedObject = new DomainObject();
-        final DomainObject domainObject = new 
WrappingDomainObject(wrappedObject, 
ImmutableEnumSet.noneOf(ExecutionMode.class));
+        final DomainObject domainObject = new 
WrappingDomainObject(wrappedObject);
 
         // when
         final DomainObject wrappingObject = wrapperFactory.wrap(domainObject);
@@ -124,7 +116,7 @@ public void wrap_ofWrapped_sameMode_returnsUnchanged() 
throws Exception {
     public void wrap_ofWrapped_differentMode_delegates_to_createProxy() throws 
Exception {
         // given
         final DomainObject wrappedObject = new DomainObject();
-        final DomainObject domainObject = new 
WrappingDomainObject(wrappedObject, 
ImmutableEnumSet.noneOf(ExecutionMode.class));
+        final DomainObject domainObject = new 
WrappingDomainObject(wrappedObject);
 
         // when
         final DomainObject wrappingObject = wrapperFactory.wrap(domainObject, 
SyncControl.control().withSkipRules());
diff --git 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyCreatorTestUsingCodegenPlugin.java
 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyCreatorTestUsingCodegenPlugin.java
index d562f6887ac..466e6f7832c 100644
--- 
a/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyCreatorTestUsingCodegenPlugin.java
+++ 
b/core/runtimeservices/src/test/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyCreatorTestUsingCodegenPlugin.java
@@ -61,7 +61,7 @@ private static class WrapperInvocationHandlerForTest 
implements WrapperInvocatio
         private final Employee delegate = new Employee();
         private final Set<String> invoked = new HashSet<>();
         private final WrapperInvocationHandler.ClassMetaData classMetaData = 
new WrapperInvocationHandler.ClassMetaData(
-                Employee.class, null, null, null);
+                Employee.class, null, null, null, null);
                 
         @Getter @Setter 
         private boolean resolveObjectChangedEnabled = false;

Reply via email to