You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/06/05 07:52:38 UTC

[isis] branch master updated: ISIS-2340: ManagedObjects: move and gather unwrap utility methods (1)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 68f1ee2  ISIS-2340: ManagedObjects: move and gather unwrap utility methods (1)
68f1ee2 is described below

commit 68f1ee28e937a324b7cb009a863883e71a3b02b2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 5 09:52:22 2020 +0200

    ISIS-2340: ManagedObjects: move and gather unwrap utility methods (1)
---
 .../core/metamodel/facets/DomainEventHelper.java   | 19 ++++++-----
 ...ctionInvocationFacetForDomainEventAbstract.java |  9 ++---
 ...ectionAddToFacetForDomainEventFromAbstract.java |  3 +-
 ...nRemoveFromFacetForDomainEventFromAbstract.java |  7 ++--
 .../modify/CollectionAddToFacetViaAccessor.java    |  3 +-
 .../CollectionRemoveFromFacetViaAccessor.java      |  3 +-
 .../parser/ParseableFacetUsingParser.java          |  5 +--
 .../mandatory/MandatoryFacetAbstract.java          |  3 +-
 ...tySetterOrClearFacetForDomainEventAbstract.java | 11 ++++---
 .../TemporalValueSemanticsProviderAbstract.java    |  3 +-
 .../interactions/ActionArgUsabilityContext.java    |  3 +-
 .../interactions/ActionArgValidityContext.java     |  5 ++-
 .../interactions/ActionArgVisibilityContext.java   |  3 +-
 .../interactions/ActionUsabilityContext.java       |  5 ++-
 .../interactions/ActionValidityContext.java        |  5 ++-
 .../interactions/ActionVisibilityContext.java      |  5 ++-
 .../interactions/CollectionAccessContext.java      |  5 ++-
 .../interactions/CollectionAddToContext.java       |  6 +++-
 .../interactions/CollectionRemoveFromContext.java  |  8 +++--
 .../interactions/CollectionVisibilityContext.java  |  5 ++-
 .../metamodel/interactions/ObjectTitleContext.java |  5 ++-
 .../interactions/ObjectValidityContext.java        |  5 ++-
 .../interactions/ObjectVisibilityContext.java      |  5 ++-
 .../metamodel/interactions/ParseValueContext.java  |  7 ++--
 .../interactions/PropertyAccessContext.java        |  8 +++--
 .../interactions/PropertyModifyContext.java        |  8 +++--
 .../interactions/PropertyUsabilityContext.java     |  5 ++-
 .../interactions/PropertyVisibilityContext.java    |  5 ++-
 .../isis/core/metamodel/spec/ManagedObject.java    | 22 +++++--------
 .../isis/core/metamodel/spec/ManagedObjects.java   | 38 +++++++++++++++-------
 .../metamodel/facets/ObjectAdapterUtilsTest.java   |  7 ++--
 .../command/CommandDtoServiceInternalDefault.java  |  3 +-
 .../handlers/DomainObjectInvocationHandler.java    |  7 ++--
 ...sistenceQueryFindUsingApplibQueryProcessor.java |  3 +-
 .../summary/CollectionContentsAsSummary.java       |  3 +-
 35 files changed, 135 insertions(+), 112 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 9e02b3e..f61ef2b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -19,11 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets;
 
-import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.core.commons.internal.reflection._Reflect.Filter.paramAssignableFrom;
-import static org.apache.isis.core.commons.internal.reflection._Reflect.Filter.paramAssignableFromValue;
-import static org.apache.isis.core.commons.internal.reflection._Reflect.Filter.paramCount;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
@@ -46,10 +41,16 @@ import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
+import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
+import static org.apache.isis.core.commons.internal.reflection._Reflect.Filter.paramAssignableFrom;
+import static org.apache.isis.core.commons.internal.reflection._Reflect.Filter.paramAssignableFromValue;
+import static org.apache.isis.core.commons.internal.reflection._Reflect.Filter.paramCount;
+
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -117,7 +118,7 @@ public class DomainEventHelper {
                 event = existingEvent;
             } else {
                 // all other phases, create a new event
-                final S source = uncheckedCast(ManagedObject.unwrapSingle(head.getTarget()));
+                final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
                 final Object[] arguments = ManagedObject.unwrapMultipleAsArray(argumentAdapters);
                 final Identifier identifier = identified.getIdentifier();
                 event = newActionDomainEvent(eventType, identifier, source, arguments);
@@ -150,7 +151,7 @@ public class DomainEventHelper {
             event.setEventPhase(phase);
 
             if(phase.isExecuted()) {
-                event.setReturnValue(ManagedObject.unwrapSingle(resultAdapter));
+                event.setReturnValue(UnwrapUtil.single(resultAdapter));
             }
 
             metamodelEventService.fireActionDomainEvent(event);
@@ -222,7 +223,7 @@ public class DomainEventHelper {
 
         try {
             final PropertyDomainEvent<S, T> event;
-            final S source = uncheckedCast(ManagedObject.unwrapSingle(head.getTarget()));
+            final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
             final Identifier identifier = identified.getIdentifier();
 
             if(existingEvent != null && phase.isExecuted()) {
@@ -315,7 +316,7 @@ public class DomainEventHelper {
                 event = existingEvent;
             } else {
                 // all other phases, create a new event
-                final S source = uncheckedCast(ManagedObject.unwrapSingle(head.getTarget()));
+                final S source = uncheckedCast(UnwrapUtil.single(head.getTarget()));
                 final Identifier identifier = identified.getIdentifier();
                 event = newCollectionDomainEvent(eventType, phase, identifier, source, of, reference);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index b65b1dc..af981ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -66,6 +66,7 @@ import org.apache.isis.core.metamodel.services.ixn.InteractionDtoServiceInternal
 import org.apache.isis.core.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.schema.ixn.v2.ActionInvocationDto;
@@ -187,10 +188,10 @@ implements ImperativeFacet {
             // otherwise, go ahead and execute action in the 'foreground'
             final ManagedObject mixinElseRegularAdapter = mixedInAdapter != null ? mixedInAdapter : targetAdapter;
 
-            final Object mixinElseRegularPojo = ManagedObject.unwrapSingle(mixinElseRegularAdapter);
+            final Object mixinElseRegularPojo = UnwrapUtil.single(mixinElseRegularAdapter);
 
             final List<Object> argumentPojos = argumentAdapters.stream()
-                    .map(ManagedObject::unwrapSingle)
+                    .map(UnwrapUtil::single)
                     .collect(_Lists.toUnmodifiable());
 
             final String targetMember = targetNameFor(owningAction, mixedInAdapter);
@@ -264,7 +265,7 @@ implements ImperativeFacet {
                     throws IllegalAccessException, InvocationTargetException {
 
         final Object[] executionParameters = ManagedObject.unwrapMultipleAsArray(arguments);
-        final Object targetPojo = ManagedObject.unwrapSingle(targetAdapter);
+        final Object targetPojo = UnwrapUtil.single(targetAdapter);
 
         final ActionSemanticsFacet semanticsFacet = getFacetHolder().getFacet(ActionSemanticsFacet.class);
         final boolean cacheable = semanticsFacet != null && semanticsFacet.value().isSafeAndRequestCacheable();
@@ -479,7 +480,7 @@ implements ImperativeFacet {
                     resultAdapterPossiblyCloned = 
                             cloneIfViewModelCloneable(returnValue, mixinElseRegularAdapter);
                 }
-                return ManagedObject.unwrapSingle(resultAdapterPossiblyCloned);
+                return UnwrapUtil.single(resultAdapterPossiblyCloned);
 
             } catch (Exception e) {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
index 599ee8e..53d8e22 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToF
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
 
@@ -73,7 +74,7 @@ implements CollectionAddToFacet {
             return;
         }
 
-        final Object referencedObject = ManagedObject.unwrapSingle(referencedObjectAdapter);
+        final Object referencedObject = UnwrapUtil.single(referencedObjectAdapter);
 
         // get hold of underlying collection
         final Object collection = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
index 5cacc7d..4b8a0ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.collections.collection.modify;
 
-import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
-
 import java.util.Collection;
 import java.util.Map;
 
@@ -37,6 +35,9 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemove
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
+
+import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
 
 
 public abstract class CollectionRemoveFromFacetForDomainEventFromAbstract
@@ -76,7 +77,7 @@ implements CollectionRemoveFromFacet {
         }
 
 
-        final Object referencedObject = ManagedObject.unwrapSingle(referencedObjectAdapter);
+        final Object referencedObject = UnwrapUtil.single(referencedObjectAdapter);
 
         // get hold of underlying collection
         // passing null through for authenticationSession/deploymentType means to avoid any visibility filtering.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
index b953b4f..0016146 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 public class CollectionAddToFacetViaAccessor extends CollectionAddToFacetAbstract implements ImperativeFacet {
 
@@ -61,7 +62,7 @@ public class CollectionAddToFacetViaAccessor extends CollectionAddToFacetAbstrac
             final InteractionInitiatedBy interactionInitiatedBy) {
         @SuppressWarnings("unchecked")
         final Collection<? super Object> collection = (Collection<? super Object>) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        final Object elementPojo = ManagedObject.unwrapSingle(elementAdapter);
+        final Object elementPojo = UnwrapUtil.single(elementAdapter);
         collection.add(elementPojo);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
index 7df316a..10c75a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 public class CollectionRemoveFromFacetViaAccessor extends CollectionRemoveFromFacetAbstract implements ImperativeFacet {
 
@@ -64,7 +65,7 @@ public class CollectionRemoveFromFacetViaAccessor extends CollectionRemoveFromFa
         
         @SuppressWarnings("unchecked")
         final Collection<? super Object> collection = (Collection<? super Object>) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        collection.remove(ManagedObject.unwrapSingle(elementAdapter));
+        collection.remove(UnwrapUtil.single(elementAdapter));
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
index 3733aae..e65e756 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
@@ -37,6 +37,7 @@ import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.interactions.ParseValueContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.val;
@@ -85,7 +86,7 @@ implements ParseableFacet {
             validate(parseValueContext);
         }
 
-        final Object context = ManagedObject.unwrapSingle(contextAdapter);
+        final Object context = UnwrapUtil.single(contextAdapter);
 
         getServiceInjector().injectServicesInto(parser);
 
@@ -125,7 +126,7 @@ implements ParseableFacet {
     @Override
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public String parseableTitle(final ManagedObject contextAdapter) {
-        final Object pojo = ManagedObject.unwrapSingle(contextAdapter);
+        final Object pojo = UnwrapUtil.single(contextAdapter);
 
         getServiceInjector().injectServicesInto(parser);
         return ((Parser)parser).parseableTitleOf(pojo);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
index 555890e..60c6333 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
@@ -31,6 +31,7 @@ import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
 import org.apache.isis.core.metamodel.interactions.ProposedHolder;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 import lombok.val;
 
@@ -62,7 +63,7 @@ public abstract class MandatoryFacetAbstract extends FacetAbstract implements Ma
     @Override
     public final boolean isRequiredButNull(final ManagedObject adapter) {
         if(!isInvertedSemantics()) {
-            val pojo = ManagedObject.unwrapSingle(adapter);
+            val pojo = UnwrapUtil.single(adapter);
             
             // special case string handling.
             if(pojo instanceof String) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index 9d3fac8..4d63f85 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.properties.property.modify;
 
-import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
-
 import java.util.Map;
 import java.util.Objects;
 
@@ -48,9 +46,12 @@ import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.services.ixn.InteractionDtoServiceInternal;
 import org.apache.isis.core.metamodel.services.publishing.PublisherDispatchService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.schema.ixn.v2.PropertyEditDto;
 
+import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
+
 import lombok.val;
 
 public abstract class PropertySetterOrClearFacetForDomainEventAbstract
@@ -201,8 +202,8 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
         } else {
 
             val targetAdapter = head.getTarget();
-            final Object target = ManagedObject.unwrapSingle(targetAdapter);
-            final Object argValue = ManagedObject.unwrapSingle(newValueAdapter);
+            final Object target = UnwrapUtil.single(targetAdapter);
+            final Object argValue = UnwrapUtil.single(newValueAdapter);
 
             final String targetMember = CommandUtil.targetMemberNameFor(owningProperty);
             final String targetClass = CommandUtil.targetClassNameFor(targetAdapter);
@@ -233,7 +234,7 @@ extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>> {
 
                         // ... post the executing event
                         final Object oldValue = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
-                        final Object newValue = ManagedObject.unwrapSingle(newValueAdapter);
+                        final Object newValue = UnwrapUtil.single(newValueAdapter);
 
                         final PropertyDomainEvent<?, ?> event =
                                 domainEventHelper.postEventForProperty(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
index 4778e18..6826285 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
@@ -39,6 +39,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -135,7 +136,7 @@ implements TemporalValueFacet<T> {
 
     @Override
     public final T temporalValue(final ManagedObject adapter) {
-        return _Casts.uncheckedCast(ManagedObject.unwrapSingle(adapter));
+        return _Casts.uncheckedCast(UnwrapUtil.single(adapter));
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
index 72508b6..476db9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgUsabilityContext.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -65,7 +66,7 @@ implements ActionInteractionContext {
     @Override
     public ActionArgumentUsabilityEvent createInteractionEvent() {
         return new ActionArgumentUsabilityEvent(
-                ManagedObject.unwrapSingle(getTarget()), 
+                UnwrapUtil.single(getTarget()), 
                 getIdentifier(), 
                 ManagedObject.unwrapMultipleAsArray(getArgs().toList()), 
                 getPosition());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
index ed64a49..98b218b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
@@ -19,14 +19,13 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.ActionArgumentEvent;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -66,7 +65,7 @@ implements ProposedHolder, ActionInteractionContext {
     @Override
     public ActionArgumentEvent createInteractionEvent() {
         return new ActionArgumentEvent(
-                unwrapSingle(getTarget()), 
+                UnwrapUtil.single(getTarget()), 
                 getIdentifier(), 
                 ManagedObject.unwrapMultipleAsArray(getArgs().toList()), 
                 getPosition());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
index 73b0283..319eba3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgVisibilityContext.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -65,7 +66,7 @@ implements ActionInteractionContext {
     @Override
     public ActionArgumentVisibilityEvent createInteractionEvent() {
         return new ActionArgumentVisibilityEvent(
-                ManagedObject.unwrapSingle(getTarget()), 
+                UnwrapUtil.single(getTarget()), 
                 getIdentifier(), 
                 ManagedObject.unwrapMultipleAsArray(getArgs().toList()), 
                 getPosition());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
index ce6bff3..d752ecd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.ActionUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 /**
@@ -55,7 +54,7 @@ implements ActionInteractionContext {
 
     @Override
     public ActionUsabilityEvent createInteractionEvent() {
-        return new ActionUsabilityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new ActionUsabilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
index b204419..515ea83 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionValidityContext.java
@@ -19,14 +19,13 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.ActionInvocationEvent;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
@@ -57,7 +56,7 @@ implements ActionInteractionContext {
     @Override
     public ActionInvocationEvent createInteractionEvent() {
         return new ActionInvocationEvent(
-                unwrapSingle(getTarget()), getIdentifier(), ManagedObject.unwrapMultipleAsArray(getArgs().toList()));
+                UnwrapUtil.single(getTarget()), getIdentifier(), ManagedObject.unwrapMultipleAsArray(getArgs().toList()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
index 1b0de8e..f006684 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.ActionVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 /**
@@ -55,7 +54,7 @@ implements ActionInteractionContext  {
 
     @Override
     public ActionVisibilityEvent createInteractionEvent() {
-        return new ActionVisibilityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new ActionVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
index 8e363c3..0c410c8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAccessContext.java
@@ -19,12 +19,11 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionAccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -41,7 +40,7 @@ public class CollectionAccessContext extends AccessContext {
 
     @Override
     public CollectionAccessEvent createInteractionEvent() {
-        return new CollectionAccessEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new CollectionAccessEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
index 8423639..9ac9bfc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionAddToContext.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.services.wrapper.events.CollectionAddToEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -52,7 +53,10 @@ implements ProposedHolder {
 
     @Override
     public CollectionAddToEvent createInteractionEvent() {
-        return new CollectionAddToEvent(ManagedObject.unwrapSingle(getTarget()), getIdentifier(), ManagedObject.unwrapSingle(getProposed()));
+        return new CollectionAddToEvent(
+                UnwrapUtil.single(getTarget()), 
+                getIdentifier(), 
+                UnwrapUtil.single(getProposed()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
index b6a84e4..088cf24 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionRemoveFromContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.CollectionRemoveFromEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -54,7 +53,10 @@ implements ProposedHolder{
 
     @Override
     public CollectionRemoveFromEvent createInteractionEvent() {
-        return new CollectionRemoveFromEvent(unwrapSingle(getTarget()), getIdentifier(), unwrapSingle(getProposed()));
+        return new CollectionRemoveFromEvent(
+                UnwrapUtil.single(getTarget()), 
+                getIdentifier(), 
+                UnwrapUtil.single(getProposed()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
index fa7767a..cec0394 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/CollectionVisibilityContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.CollectionVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -44,7 +43,7 @@ extends VisibilityContext {
 
     @Override
     public CollectionVisibilityEvent createInteractionEvent() {
-        return new CollectionVisibilityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new CollectionVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
index 85208b9..0da0918 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectTitleContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.ObjectTitleEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -49,7 +48,7 @@ extends AccessContext {
 
     @Override
     public ObjectTitleEvent createInteractionEvent() {
-        return new ObjectTitleEvent(unwrapSingle(getTarget()), getIdentifier(), getTitle());
+        return new ObjectTitleEvent(UnwrapUtil.single(getTarget()), getIdentifier(), getTitle());
     }
 
     private String getTitle() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
index 4306071..eef3fc2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectValidityContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.ObjectValidityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -46,7 +45,7 @@ implements ProposedHolder {
 
     @Override
     public ObjectValidityEvent createInteractionEvent() {
-        return new ObjectValidityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new ObjectValidityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
index 6553836..4576d18 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ObjectVisibilityContext.java
@@ -19,14 +19,13 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.ObjectVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -49,7 +48,7 @@ implements ProposedHolder {
 
     @Override
     public ObjectVisibilityEvent createInteractionEvent() {
-        return new ObjectVisibilityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new ObjectVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
index 6c8b2f7..0f4402d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ParseValueContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.ParseValueEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -54,8 +53,8 @@ implements ProposedHolder {
 
     @Override
     public ParseValueEvent createInteractionEvent() {
-        final String proposedPojo = (String) unwrapSingle(getProposed());
-        return new ParseValueEvent(unwrapSingle(getTarget()), getIdentifier(), proposedPojo);
+        final String proposedPojo = (String) UnwrapUtil.single(getProposed());
+        return new ParseValueEvent(UnwrapUtil.single(getTarget()), getIdentifier(), proposedPojo);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
index d021f0e..e7afd52 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyAccessContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.PropertyAccessEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -55,7 +54,10 @@ extends AccessContext {
 
     @Override
     public PropertyAccessEvent createInteractionEvent() {
-        return new PropertyAccessEvent(unwrapSingle(getTarget()), getIdentifier(), unwrapSingle(getValue()));
+        return new PropertyAccessEvent(
+                UnwrapUtil.single(getTarget()), 
+                getIdentifier(), 
+                UnwrapUtil.single(getValue()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
index ae486f4..f6c6809 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyModifyContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.wrapper.events.PropertyModifyEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -57,7 +56,10 @@ implements ProposedHolder {
 
     @Override
     public PropertyModifyEvent createInteractionEvent() {
-        return new PropertyModifyEvent(unwrapSingle(getTarget()), getIdentifier(), unwrapSingle(getProposed()));
+        return new PropertyModifyEvent(
+                UnwrapUtil.single(getTarget()), 
+                getIdentifier(), 
+                UnwrapUtil.single(getProposed()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
index 80f9442..5a2d121 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyUsabilityContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.PropertyUsabilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -44,7 +43,7 @@ extends UsabilityContext {
 
     @Override
     public PropertyUsabilityEvent createInteractionEvent() {
-        return new PropertyUsabilityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new PropertyUsabilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
index d61ebea..8e27a39 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/PropertyVisibilityContext.java
@@ -19,13 +19,12 @@
 
 package org.apache.isis.core.metamodel.interactions;
 
-import static org.apache.isis.core.metamodel.spec.ManagedObject.unwrapSingle;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 /**
  * See {@link InteractionContext} for overview; analogous to
@@ -43,7 +42,7 @@ public class PropertyVisibilityContext extends VisibilityContext {
 
     @Override
     public PropertyVisibilityEvent createInteractionEvent() {
-        return new PropertyVisibilityEvent(unwrapSingle(getTarget()), getIdentifier());
+        return new PropertyVisibilityEvent(UnwrapUtil.single(getTarget()), getIdentifier());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index d4546be..56d586a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -41,6 +41,7 @@ import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault;
 
@@ -250,33 +251,26 @@ public interface ManagedObject {
     // -- UNWRAPPING
 
     @Nullable
-    public static Object unwrapSingle(@Nullable final ManagedObject adapter) {
-        return ManagedObjects.isSpecified(adapter)
-                ? adapter.getPojo() 
-                : null;
-    }
-    
-    @Nullable
     public static Object[] unwrapMultipleAsArray(@NonNull final Can<ManagedObject> adapters) {
-        val unwrappedObjects = _Arrays.mapCollection(adapters.toList(), ManagedObject::unwrapSingle);
+        val unwrappedObjects = _Arrays.mapCollection(adapters.toList(), UnwrapUtil::single);
         return unwrappedObjects;
     }
     
     @Nullable
     public static Object[] unwrapMultipleAsArray(@Nullable final Collection<ManagedObject> adapters) {
-        val unwrappedObjects = _Arrays.mapCollection(adapters, ManagedObject::unwrapSingle);
+        val unwrappedObjects = _Arrays.mapCollection(adapters, UnwrapUtil::single);
         return unwrappedObjects;
     }
 
     @Nullable
     public static Object[] unwrapMultipleAsArray(@Nullable final ManagedObject[] adapters) {
-        val unwrappedObjects = _Arrays.map(adapters, ManagedObject::unwrapSingle);
+        val unwrappedObjects = _Arrays.map(adapters, UnwrapUtil::single);
         return unwrappedObjects;
     }
 
     @Nullable
     public static String unwrapSingleAsStringOrElse(@Nullable final ManagedObject adapter, @Nullable String orElse) {
-        final Object obj = ManagedObject.unwrapSingle(adapter);
+        final Object obj = UnwrapUtil.single(adapter);
         if (obj == null) {
             return null;
         }
@@ -296,7 +290,7 @@ public interface ManagedObject {
             return Collections.emptyList();
         }
         return adapters.stream()
-                .map(ManagedObject::unwrapSingle)
+                .map(UnwrapUtil::single)
                 .collect(_Lists.toUnmodifiable());
     }
     
@@ -310,7 +304,7 @@ public interface ManagedObject {
             return Collections.emptyList();
         }
         return adapters.stream()
-                .map(ManagedObject::unwrapSingle)
+                .map(UnwrapUtil::single)
                 .collect(_Lists.toUnmodifiable());
     }
 
@@ -325,7 +319,7 @@ public interface ManagedObject {
             return Collections.emptySet();
         }
         return adapters.stream()
-                .map(ManagedObject::unwrapSingle)
+                .map(UnwrapUtil::single)
                 .collect(_Sets.toUnmodifiable());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index f50e147..cfa5f13 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -169,8 +169,8 @@ public final class ManagedObjects {
         @SuppressWarnings({ "unchecked", "rawtypes" })
         @Override
         public int compare(@Nullable ManagedObject p, @Nullable ManagedObject q) {
-            val pPojo = ManagedObject.unwrapSingle(p);
-            val qPojo = ManagedObject.unwrapSingle(q);
+            val pPojo = UnwrapUtil.single(p);
+            val qPojo = UnwrapUtil.single(q);
             if(pPojo instanceof Comparable && qPojo instanceof Comparable) {
                 return _NullSafe.compareNullsFirst((Comparable)pPojo, (Comparable)qPojo);
             }
@@ -302,7 +302,7 @@ public final class ManagedObjects {
     
             return CollectionFacet.streamAdapters(collectionAdapter)
                     .filter(VisibilityUtil.filterOn(interactionInitiatedBy))
-                    .map(ManagedObject::unwrapSingle);
+                    .map(UnwrapUtil::single);
         }
         
         public static Object[] visiblePojosAsArray(
@@ -384,7 +384,7 @@ public final class ManagedObjects {
             
             val ppmTuple = MethodExtensions.construct(ppmConstructor, ManagedObject.unwrapMultipleAsArray(pendingArguments));
             val paramPojos = _Arrays.combineWithExplicitType(Object.class, ppmTuple, additionalArguments.toArray());
-            return MethodExtensions.invoke(method, ManagedObject.unwrapSingle(adapter), paramPojos);
+            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), paramPojos);
         }
         
         public static Object invokeWithPPM(
@@ -396,27 +396,27 @@ public final class ManagedObjects {
         }
         
         public static void invokeAll(Collection<Method> methods, final ManagedObject adapter) {
-            MethodUtil.invoke(methods, ManagedObject.unwrapSingle(adapter));
+            MethodUtil.invoke(methods, UnwrapUtil.single(adapter));
         }
     
         public static Object invoke(Method method, ManagedObject adapter) {
-            return MethodExtensions.invoke(method, ManagedObject.unwrapSingle(adapter));
+            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter));
         }
     
         public static Object invoke(Method method, ManagedObject adapter, Object arg0) {
-            return MethodExtensions.invoke(method, ManagedObject.unwrapSingle(adapter), new Object[] {arg0});
+            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), new Object[] {arg0});
         }
     
         public static Object invoke(Method method, ManagedObject adapter, Can<ManagedObject> argumentAdapters) {
-            return MethodExtensions.invoke(method, ManagedObject.unwrapSingle(adapter), ManagedObject.unwrapMultipleAsArray(argumentAdapters));
+            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), ManagedObject.unwrapMultipleAsArray(argumentAdapters));
         }
     
         public static Object invoke(Method method, ManagedObject adapter, ManagedObject arg0Adapter) {
-            return invoke(method, adapter, ManagedObject.unwrapSingle(arg0Adapter));
+            return invoke(method, adapter, UnwrapUtil.single(arg0Adapter));
         }
     
         public static Object invoke(Method method, ManagedObject adapter, ManagedObject[] argumentAdapters) {
-            return MethodExtensions.invoke(method, ManagedObject.unwrapSingle(adapter), ManagedObject.unwrapMultipleAsArray(argumentAdapters));
+            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), ManagedObject.unwrapMultipleAsArray(argumentAdapters));
         }
 
         /**
@@ -449,7 +449,7 @@ public final class ManagedObjects {
     
             val argArray = adjust(method, pendingArgs, additionalArgValues);
             
-            return MethodExtensions.invoke(method, ManagedObject.unwrapSingle(target), argArray);
+            return MethodExtensions.invoke(method, UnwrapUtil.single(target), argArray);
         }
     
         /**
@@ -478,7 +478,7 @@ public final class ManagedObjects {
             for(int i=0; i<pendingArgsToConsiderCount; i++) {
                 
                 val paramType = parameterTypes[i];
-                val arg = argIterator.hasNext() ? ManagedObject.unwrapSingle(argIterator.next()) : null;
+                val arg = argIterator.hasNext() ? UnwrapUtil.single(argIterator.next()) : null;
                 
                 adjusted[i] = honorPrimitiveDefaults(paramType, arg);
             }
@@ -512,5 +512,19 @@ public final class ManagedObjects {
     
     }
     
+    // -- UNWRAP UTILITY
+    
+    @UtilityClass
+    public static final class UnwrapUtil {
+        
+        @Nullable
+        public static Object single(@Nullable final ManagedObject adapter) {
+            return ManagedObjects.isSpecified(adapter)
+                    ? adapter.getPojo() 
+                    : null;
+        }
+        
+    }
+    
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
index 3c93811..ae847e5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
@@ -27,9 +27,10 @@ import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 public class ObjectAdapterUtilsTest {
 
@@ -42,14 +43,14 @@ public class ObjectAdapterUtilsTest {
 
     @Test
     public void testUnwrapObjectWhenNull() {
-        assertNull(ManagedObject.unwrapSingle((ManagedObject)null));
+        assertNull(UnwrapUtil.single((ManagedObject)null));
     }
 
     @Test
     public void testUnwrapObjectWhenNotNull() {
         underlyingDomainObject = new Object(); 
         expectAdapterWillReturn(underlyingDomainObject);
-        assertEquals(underlyingDomainObject, ManagedObject.unwrapSingle(mockObjectAdapter));
+        assertEquals(underlyingDomainObject, UnwrapUtil.single(mockObjectAdapter));
     }
 
     @Test
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoServiceInternalDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoServiceInternalDefault.java
index 27384e2..b21c46e 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoServiceInternalDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoServiceInternalDefault.java
@@ -40,6 +40,7 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUt
 import org.apache.isis.core.metamodel.services.command.CommandDtoServiceInternal;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -170,7 +171,7 @@ public class CommandDtoServiceInternalDefault implements CommandDtoServiceIntern
         final Class<?> valueType = valueSpec.getCorrespondingClass();
 
         final ValueWithTypeDto newValue = CommonDtoUtils.newValueWithTypeDto(
-                valueType, ManagedObject.unwrapSingle(valueAdapter), bookmarkService);
+                valueType, UnwrapUtil.single(valueAdapter), bookmarkService);
         propertyDto.setNewValue(newValue);
     }
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index 6f73ad8..b373263 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -53,6 +53,7 @@ import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -413,7 +414,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
             val interactionInitiatedBy = getInteractionInitiatedBy();
             val currentReferencedAdapter = property.get(targetAdapter, interactionInitiatedBy);
 
-            val currentReferencedObj = ManagedObject.unwrapSingle(currentReferencedAdapter);
+            val currentReferencedObj = UnwrapUtil.single(currentReferencedAdapter);
 
             val propertyAccessEvent = new PropertyAccessEvent(
                     getDelegate(), property.getIdentifier(), currentReferencedObj);
@@ -485,7 +486,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
             val interactionInitiatedBy = getInteractionInitiatedBy();
             val currentReferencedAdapter = collection.get(targetAdapter, interactionInitiatedBy);
 
-            val currentReferencedObj = ManagedObject.unwrapSingle(currentReferencedAdapter);
+            val currentReferencedObj = UnwrapUtil.single(currentReferencedAdapter);
 
             val collectionAccessEvent = new CollectionAccessEvent(getDelegate(), collection.getIdentifier());
 
@@ -649,7 +650,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
             val returnedAdapter = objectAction.execute(
                     head, argAdapters,
                     interactionInitiatedBy);
-            return ManagedObject.unwrapSingle(returnedAdapter);
+            return UnwrapUtil.single(returnedAdapter);
             
         });
         
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index 0852cde..dba6c7e 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.metamodel.JdoPropertyUtils;
@@ -150,7 +151,7 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         final Map<String, Object> argumentsByParameterName = _Maps.newHashMap();
         for (final String parameterName : argumentAdaptersByParameterName.keySet()) {
             final ObjectAdapter argumentAdapter = argumentAdaptersByParameterName.get(parameterName);
-            final Object argument = ManagedObject.unwrapSingle(argumentAdapter);
+            final Object argument = ManagedObjects.UnwrapUtil.single(argumentAdapter);
             argumentsByParameterName.put(parameterName, argument);
         }
         return argumentsByParameterName;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
index da671ff..a6c6d49 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
@@ -34,6 +34,7 @@ import org.apache.wicket.model.Model;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -135,7 +136,7 @@ public class CollectionContentsAsSummary extends PanelAbstract<EntityCollectionM
                     values.add(null);
                     continue;
                 }
-                final Object valueObj = ManagedObject.unwrapSingle(valueAdapter);
+                final Object valueObj = ManagedObjects.UnwrapUtil.single(valueAdapter);
                 if (valueObj == null) {
                     values.add(null);
                     continue;