You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/05/13 18:13:51 UTC

[09/50] [abbrv] isis git commit: ISIS-1398: moving the command stuff to PropertySetter/ClearFacetForDomainEventAbstract, and out of the wrapped original PropertySetterFacet or PropertyClearFacet.

ISIS-1398: moving the command stuff to PropertySetter/ClearFacetForDomainEventAbstract, and out of the wrapped original PropertySetterFacet or PropertyClearFacet.

Also:
- remove DomainEventHelper#hasEventBusService() since will always return true


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/6341730e
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/6341730e
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/6341730e

Branch: refs/heads/master
Commit: 6341730eae555bb069b80ee8fa84abfb65771476
Parents: 07342da
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon May 2 11:08:31 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon May 2 11:08:31 2016 +0100

----------------------------------------------------------------------
 .../metamodel/facets/DomainEventHelper.java     |  28 +---
 .../ActionDomainEventFacetAbstract.java         |   9 --
 ...onInvocationFacetForDomainEventAbstract.java |  12 +-
 .../actions/action/invocation/CommandUtil.java  |   6 +-
 ...ionAddToFacetForDomainEventFromAbstract.java |   4 -
 .../CollectionDomainEventFacetAbstract.java     |   9 --
 ...moveFromFacetForDomainEventFromAbstract.java |   5 -
 ...ropertyClearFacetForDomainEventAbstract.java | 153 ++++++++++++++++---
 .../PropertyDomainEventFacetAbstract.java       |   9 --
 ...opertySetterFacetForDomainEventAbstract.java | 147 ++++++++++++++++--
 .../update/PropertyModifyFacetFactory.java      |   2 +-
 .../update/clear/PropertyClearFacet.java        |   6 +-
 .../clear/PropertyClearFacetViaClearMethod.java |   8 +-
 .../PropertyClearFacetViaSetterMethod.java      |   8 +-
 .../update/modify/PropertySetterFacet.java      |   2 +-
 .../PropertySetterFacetViaModifyMethod.java     |  76 +--------
 .../PropertySetterFacetViaSetterMethod.java     |   3 +-
 .../services/command/CommandMementoService.java |   4 +-
 .../specimpl/OneToOneAssociationDefault.java    |  12 +-
 .../PropertyAnnotationFacetFactoryTest.java     |   2 +-
 .../command/CommandMementoServiceDefault.java   |   2 +-
 ...WrapperFactoryDefaultTest_wrappedObject.java |   2 +-
 22 files changed, 320 insertions(+), 189 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
----------------------------------------------------------------------
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 07d03e9..0e3a566 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
@@ -69,10 +69,6 @@ public class DomainEventHelper {
             final Command command,
             final ObjectAdapter resultAdapter) {
 
-        if(!hasEventBusService()) {
-            return null;
-        }
-
         try {
             final ActionDomainEvent<?> event;
 
@@ -199,9 +195,6 @@ public class DomainEventHelper {
             final Object oldValue,
             final Object newValue) {
 
-        if(!hasEventBusService()) {
-            return null;
-        }
         try {
             final PropertyDomainEvent<?, ?> event;
             final Object source = ObjectAdapter.Util.unwrap(targetAdapter);
@@ -292,9 +285,6 @@ public class DomainEventHelper {
             final ObjectAdapter targetAdapter,
             final CollectionDomainEvent.Of of,
             final Object reference) {
-        if(!hasEventBusService()) {
-            return null;
-        }
         try {
             final CollectionDomainEvent<?, ?> event;
             if (existingEvent != null && phase.isExecuted()) {
@@ -419,22 +409,10 @@ public class DomainEventHelper {
 
     //region > eventBusService
 
-    private EventBusService eventBusService;
-    private boolean searchedForEventBusService = false;
-
-    public boolean hasEventBusService() {
-        return getEventBusService() != null;
-    }
-
     private EventBusService getEventBusService() {
-        if (!searchedForEventBusService) {
-            eventBusService = this.servicesInjector.lookupService(EventBusService.class);
-        }
-        // this caching has been disabled, because it prevents integration tests from switching out the
-        // EventBusService with a mock.
-        // perhaps a better appraoch
-        //searchedForEventBusService = true;
-        return eventBusService;
+        // previously this method used to cache, however it prevents integration tests
+        // from switching out the EventBusService with a mock.
+        return this.servicesInjector.lookupService(EventBusService.class);
     }
 
     //endregion

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
index 19694b9..45e3dc5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
@@ -74,9 +74,6 @@ public abstract class ActionDomainEventFacetAbstract
 
     @Override
     public String hides(final VisibilityContext<? extends VisibilityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final ActionDomainEvent<?> event =
                 domainEventHelper.postEventForAction(
@@ -94,9 +91,6 @@ public abstract class ActionDomainEventFacetAbstract
 
     @Override
     public String disables(UsabilityContext<? extends UsabilityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final ActionDomainEvent<?> event =
                 domainEventHelper.postEventForAction(
@@ -132,9 +126,6 @@ public abstract class ActionDomainEventFacetAbstract
 
     @Override
     public String invalidates(final ValidityContext<? extends ValidityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final ActionInvocationContext aic = (ActionInvocationContext) ic;
         final ActionDomainEvent<?> event =

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
----------------------------------------------------------------------
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 d57539b..ef7c3fc 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
@@ -196,6 +196,8 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
             final ObjectAdapter[] arguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
+        // similar code in Property{Setter/Clear}FacetFDEA
+
         final CommandContext commandContext = getCommandContext();
         final Command command = commandContext.getCommand();
 
@@ -208,8 +210,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
                         command,
                         null);
 
-        final InvocationResult invocationResult = invoke(owningAction, targetAdapter, arguments);
-
+        final InvocationResult invocationResult = invokeInternal(owningAction, targetAdapter, arguments);
         final ObjectAdapter invocationResultAdapter = invocationResult.getAdapter();
 
         // ... post the executed event
@@ -229,14 +230,15 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
         }
 
         return filteredIfRequired(invocationResultAdapter, interactionInitiatedBy);
-
     }
 
-    private InvocationResult invoke(
+    private InvocationResult invokeInternal(
             final ObjectAction owningAction,
             final ObjectAdapter targetAdapter,
             final ObjectAdapter[] argumentAdapters) {
 
+        // similar code in Property{Setter/Clear}FacetFDEA
+
         try {
             owningAction.setupActionInvocationContext(targetAdapter);
             owningAction.setupCommand(targetAdapter, argumentAdapters);
@@ -294,6 +296,8 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
             final ObjectAdapter[] argumentAdapters)
             throws IllegalAccessException, InvocationTargetException {
 
+        // similar code in Property{Setter/Clear}FacetFDEA
+
         final CommandContext commandContext = getCommandContext();
         final Command command = commandContext.getCommand();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
index 92843ae..45db776 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/CommandUtil.java
@@ -59,7 +59,11 @@ public class CommandUtil {
 
     public static String argDescriptionFor(final ObjectAdapter valueAdapter) {
         final StringBuilder buf = new StringBuilder();
-        appendArg(buf, "new value", valueAdapter);
+        if(valueAdapter != null) {
+            appendArg(buf, "new value", valueAdapter);
+        } else {
+            buf.append("cleared");
+        }
         return buf.toString();
     }
     public static String argDescriptionFor(

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionAddToFacetForDomainEventFromAbstract.java
----------------------------------------------------------------------
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 bfa1dde..a5f4625 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
@@ -68,10 +68,6 @@ public abstract class CollectionAddToFacetForDomainEventFromAbstract
         if (this.collectionAddToFacet == null) {
             return;
         }
-        if(!domainEventHelper.hasEventBusService()) {
-            collectionAddToFacet.add(targetAdapter, referencedObjectAdapter, interactionInitiatedBy);
-            return;
-        }
 
         final Object referencedObject = ObjectAdapter.Util.unwrap(referencedObjectAdapter);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
index 4a433fb..8e80972 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java
@@ -60,9 +60,6 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
 
     @Override
     public String hides(final VisibilityContext<? extends VisibilityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final CollectionDomainEvent<?, ?> event =
                 domainEventHelper.postEventForCollection(
@@ -79,9 +76,6 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
 
     @Override
     public String disables(final UsabilityContext<? extends UsabilityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final CollectionDomainEvent<?, ?> event =
                 domainEventHelper.postEventForCollection(
@@ -102,9 +96,6 @@ public abstract class CollectionDomainEventFacetAbstract extends SingleClassValu
 
     @Override
     public String invalidates(final ValidityContext<? extends ValidityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final ProposedHolder catc = (ProposedHolder) ic;
         final Object proposed = catc.getProposed().getObject();

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionRemoveFromFacetForDomainEventFromAbstract.java
----------------------------------------------------------------------
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 ae52f09..500beaa 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
@@ -69,11 +69,6 @@ public abstract class CollectionRemoveFromFacetForDomainEventFromAbstract
         if (this.collectionRemoveFromFacet == null) {
             return;
         }
-        if(!domainEventHelper.hasEventBusService()) {
-            collectionRemoveFromFacet.remove(targetAdapter, referencedObjectAdapter, interactionInitiatedBy
-            );
-            return;
-        }
 
 
         final Object referencedObject = ObjectAdapter.Util.unwrap(referencedObjectAdapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
index a689f3c..882b598 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
@@ -20,8 +20,16 @@
 package org.apache.isis.core.metamodel.facets.properties.property.modify;
 
 import com.google.common.base.Objects;
+
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.applib.services.command.spi.CommandService;
 import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
 import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
+import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.InteractionContext;
+import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -31,6 +39,7 @@ import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public abstract class PropertyClearFacetForDomainEventAbstract
         extends SingleValueFacetAbstract<Class<? extends PropertyDomainEvent<?,?>>>
@@ -47,6 +56,8 @@ public abstract class PropertyClearFacetForDomainEventAbstract
     private final PropertyClearFacet clearFacet;
     private final PropertyDomainEventFacetAbstract propertyDomainEventFacet;
 
+    private final ServicesInjector servicesInjector;
+
     public PropertyClearFacetForDomainEventAbstract(
             final Class<? extends PropertyDomainEvent<?, ?>> eventType,
             final PropertyOrCollectionAccessorFacet getterFacet,
@@ -58,23 +69,21 @@ public abstract class PropertyClearFacetForDomainEventAbstract
         this.getterFacet = getterFacet;
         this.clearFacet = clearFacet;
         this.propertyDomainEventFacet = propertyDomainEventFacet;
+        this.servicesInjector = servicesInjector;
         this.domainEventHelper = new DomainEventHelper(servicesInjector);
     }
 
     @Override
     public void clearProperty(
-            final ObjectAdapter targetAdapter,
+            final OneToOneAssociation owningProperty, final ObjectAdapter targetAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        if(clearFacet == null) {
-            return;
-        }
 
-        if(!domainEventHelper.hasEventBusService()) {
-            clearFacet.clearProperty(targetAdapter, interactionInitiatedBy);
+        // similar code in PropertySetterFacetFDEA and ActionInvocationFacetFDEA
+
+        if(clearFacet == null) {
             return;
         }
 
-
         // ... post the executing event
         final Object oldValue = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
         final PropertyDomainEvent<?, ?> event =
@@ -84,22 +93,98 @@ public abstract class PropertyClearFacetForDomainEventAbstract
                         getIdentified(), targetAdapter,
                         oldValue, null);
 
-        // ... perform the property clear
-        clearFacet.clearProperty(targetAdapter, interactionInitiatedBy);
+        clearPropertyInternal(owningProperty, targetAdapter, interactionInitiatedBy);
 
         // reading the actual value from the target object, playing it safe...
         final Object actualNewValue = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
-        if(Objects.equal(oldValue, actualNewValue)) {
-            // do nothing.
-            return;
+        if (!Objects.equal(oldValue, actualNewValue)) {
+
+            // ... and post the event (reusing event from before)
+            domainEventHelper.postEventForProperty(
+                    AbstractDomainEvent.Phase.EXECUTED,
+                    eventType(), verify(event),
+                    getIdentified(), targetAdapter,
+                    oldValue, actualNewValue);
+
         }
 
-        // ... and post the event (reusing event from before)
-        domainEventHelper.postEventForProperty(
-                AbstractDomainEvent.Phase.EXECUTED,
-                eventType(), verify(event),
-                getIdentified(), targetAdapter,
-                oldValue, actualNewValue);
+    }
+
+    private void clearPropertyInternal(
+            final OneToOneAssociation owningProperty,
+            final ObjectAdapter targetAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        // similar code in PropertySetterFacetFDEA and ActionInvocationFacetFDEA
+
+        final ObjectAdapter valueAdapter = null;
+        owningProperty.setupCommand(targetAdapter, valueAdapter);
+
+        invokeThruCommand(owningProperty, targetAdapter, interactionInitiatedBy);
+    }
+
+    private void invokeThruCommand(
+            final OneToOneAssociation owningProperty,
+            final ObjectAdapter targetAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        // similar code in PropertySetterFacetFDEA and ActionInvocationFacetFDEA
+
+        final CommandContext commandContext = getCommandContext();
+        final Command command = commandContext.getCommand();
+
+        final InteractionContext interactionContext = getInteractionContext();
+        final Interaction interaction = interactionContext.getInteraction();
+
+        final String propertyId = owningProperty.getIdentifier().toClassAndNameIdentityString();
+
+
+        if( command.getExecutor() == Command.Executor.USER &&
+                command.getExecuteIn() == org.apache.isis.applib.annotation.Command.ExecuteIn.BACKGROUND) {
+
+            // deal with background commands
+
+            // persist command so can it can subsequently be invoked in the 'background'
+            final CommandService commandService = getCommandService();
+            if (!commandService.persistIfPossible(command)) {
+                throw new IsisException(String.format(
+                        "Unable to persist command for property '%s'; CommandService does not support persistent commands ",
+                        propertyId));
+            }
+
+        } else {
+
+            // otherwise, go ahead and execute action in the 'foreground'
+
+            final Object target = ObjectAdapter.Util.unwrap(targetAdapter);
+
+            final Object argValue = null;
+            final Interaction.PropertyArgs propertyArgs = new Interaction.PropertyArgs(propertyId, target, argValue);
+            final Interaction.MemberCallable<?> callable = new Interaction.MemberCallable<Interaction.PropertyArgs>() {
+                @Override public Object call(final Interaction.PropertyArgs propertyArgs11) {
+
+                    // ... perform the property clear
+                    clearFacet.clearProperty(owningProperty, targetAdapter, interactionInitiatedBy);
+
+                    return null;
+                }
+            };
+
+            interaction.execute(callable, propertyArgs, getClockService(), command);
+
+            final Interaction.Execution priorExecution = interaction.getPriorExecution();
+
+            final RuntimeException executionExceptionIfAny = priorExecution.getException();
+            if(executionExceptionIfAny != null) {
+                throw executionExceptionIfAny;
+            }
+
+            //
+            // at this point in ActionInvocationFacetFDEA, the action is optionally published via the
+            // PublishingServiceInternal.  However, we currently do not support the concept of publishing simple
+            // property modifications.
+            //
+        }
 
     }
 
@@ -115,4 +200,36 @@ public abstract class PropertyClearFacetForDomainEventAbstract
         return value();
     }
 
+
+    private CommandContext getCommandContext() {
+        return lookupService(CommandContext.class);
+    }
+
+    private InteractionContext getInteractionContext() {
+        return lookupService(InteractionContext.class);
+    }
+
+    private CommandService getCommandService() {
+        return lookupService(CommandService.class);
+    }
+
+    private ClockService getClockService() {
+        return lookupService(ClockService.class);
+    }
+
+    private <T> T lookupService(final Class<T> serviceClass) {
+        T service = lookupServiceIfAny(serviceClass);
+        if(service == null) {
+            throw new IllegalStateException("The '" + serviceClass.getName() + "' service is not registered!");
+        }
+        return service;
+    }
+    private <T> T lookupServiceIfAny(final Class<T> serviceClass) {
+        return getServicesInjector().lookupService(serviceClass);
+    }
+
+    private ServicesInjector getServicesInjector() {
+        return servicesInjector;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
index 44b1b8b..1a0494a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
@@ -66,9 +66,6 @@ public abstract class PropertyDomainEventFacetAbstract
 
     @Override
     public String hides(VisibilityContext<? extends VisibilityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final PropertyDomainEvent<?, ?> event =
                 domainEventHelper.postEventForProperty(
@@ -84,9 +81,6 @@ public abstract class PropertyDomainEventFacetAbstract
 
     @Override
     public String disables(UsabilityContext<? extends UsabilityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final PropertyDomainEvent<?, ?> event =
                 domainEventHelper.postEventForProperty(
@@ -106,9 +100,6 @@ public abstract class PropertyDomainEventFacetAbstract
 
     @Override
     public String invalidates(ValidityContext<? extends ValidityEvent> ic) {
-        if(!domainEventHelper.hasEventBusService()) {
-            return null;
-        }
 
         final Object oldValue = getterFacet.getProperty(ic.getTarget(),
                 ic.getInitiatedBy());

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
index 4773c7d..1509e41 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
@@ -20,8 +20,16 @@
 package org.apache.isis.core.metamodel.facets.properties.property.modify;
 
 import com.google.common.base.Objects;
+
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.applib.services.command.spi.CommandService;
 import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
 import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
+import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactn.InteractionContext;
+import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -47,6 +55,9 @@ public abstract class PropertySetterFacetForDomainEventAbstract
     private final PropertySetterFacet setterFacet;
     private final PropertyDomainEventFacetAbstract propertyDomainEventFacet;
 
+    private final ServicesInjector servicesInjector;
+
+
     public PropertySetterFacetForDomainEventAbstract(
             final Class<? extends PropertyDomainEvent<?, ?>> eventType,
             final PropertyOrCollectionAccessorFacet getterFacet,
@@ -58,6 +69,7 @@ public abstract class PropertySetterFacetForDomainEventAbstract
         this.getterFacet = getterFacet;
         this.setterFacet = setterFacet;
         this.propertyDomainEventFacet = propertyDomainEventFacet;
+        this.servicesInjector = servicesInjector;
         this.domainEventHelper = new DomainEventHelper(servicesInjector);
     }
 
@@ -67,14 +79,12 @@ public abstract class PropertySetterFacetForDomainEventAbstract
             final ObjectAdapter targetAdapter,
             final ObjectAdapter newValueAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
+
+        // similar code in PropertyClearFacetFDEA and ActionInvocationFacetFDEA
+
         if(setterFacet == null) {
             return;
         }
-        if(!domainEventHelper.hasEventBusService()) {
-            setterFacet.setProperty(owningAssociation, targetAdapter, newValueAdapter, interactionInitiatedBy);
-            return;
-        }
-
 
         // ... post the executing event
         final Object oldValue = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
@@ -87,23 +97,95 @@ public abstract class PropertySetterFacetForDomainEventAbstract
                         getIdentified(), targetAdapter,
                         oldValue, newValue);
 
-        // ... perform the property modification
-        setterFacet.setProperty(owningAssociation, targetAdapter, newValueAdapter, interactionInitiatedBy);
+        setPropertyInternal(owningAssociation, targetAdapter, newValueAdapter, interactionInitiatedBy);
 
         // reading the actual value from the target object, playing it safe...
         final Object actualNewValue = getterFacet.getProperty(targetAdapter, interactionInitiatedBy);
-        if(Objects.equal(oldValue, actualNewValue)) {
-            // do nothing
-            return;
+        if (!Objects.equal(oldValue, actualNewValue)) {
+
+            // ... post the executed event
+            domainEventHelper.postEventForProperty(
+                    AbstractDomainEvent.Phase.EXECUTED,
+                    eventType(), verify(event),
+                    getIdentified(), targetAdapter,
+                    oldValue, actualNewValue);
         }
+    }
 
-        // ... post the executed event
-        domainEventHelper.postEventForProperty(
-                AbstractDomainEvent.Phase.EXECUTED,
-                eventType(), verify(event),
-                getIdentified(), targetAdapter,
-                oldValue, actualNewValue);
+    public void setPropertyInternal(
+            final OneToOneAssociation owningAssociation,
+            final ObjectAdapter targetAdapter,
+            final ObjectAdapter newValueAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
 
+        // similar code in PropertyClearFacetFDEA and ActionInvocationFacetFDEA
+
+        owningAssociation.setupCommand(targetAdapter, newValueAdapter);
+
+        invokeThruCommand(owningAssociation, targetAdapter, newValueAdapter, interactionInitiatedBy);
+    }
+
+    private void invokeThruCommand(
+            final OneToOneAssociation owningProperty,
+            final ObjectAdapter targetAdapter,
+            final ObjectAdapter valueAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        // similar code in PropertyClearFacetFDEA and ActionInvocationFacetFDEA
+
+        final CommandContext commandContext = getCommandContext();
+        final Command command = commandContext.getCommand();
+
+        final InteractionContext interactionContext = getInteractionContext();
+        final Interaction interaction = interactionContext.getInteraction();
+
+        final String propertyId = owningProperty.getIdentifier().toClassAndNameIdentityString();
+
+        if( command.getExecutor() == Command.Executor.USER &&
+                command.getExecuteIn() == org.apache.isis.applib.annotation.Command.ExecuteIn.BACKGROUND) {
+
+            // deal with background commands
+
+            // persist command so can it can subsequently be invoked in the 'background'
+            final CommandService commandService = getCommandService();
+            if (!commandService.persistIfPossible(command)) {
+                throw new IsisException(String.format(
+                        "Unable to persist command for property '%s'; CommandService does not support persistent commands ",
+                        propertyId));
+            }
+
+        } else {
+
+            // otherwise, go ahead and execute action in the 'foreground'
+
+            final Object target = ObjectAdapter.Util.unwrap(targetAdapter);
+            final Object argValue = ObjectAdapter.Util.unwrap(valueAdapter);
+
+            final Interaction.PropertyArgs propertyArgs = new Interaction.PropertyArgs(propertyId, target, argValue);
+            final Interaction.MemberCallable<?> callable = new Interaction.MemberCallable<Interaction.PropertyArgs>() {
+                        @Override public Object call(final Interaction.PropertyArgs propertyArgs11) {
+
+                            setterFacet.setProperty(
+                                    owningProperty, targetAdapter, valueAdapter, interactionInitiatedBy);
+                            return null;
+                        }
+                    };
+
+            interaction.execute(callable, propertyArgs, getClockService(), command);
+
+            final Interaction.Execution priorExecution = interaction.getPriorExecution();
+
+            final RuntimeException executionExceptionIfAny = priorExecution.getException();
+            if(executionExceptionIfAny != null) {
+                throw executionExceptionIfAny;
+            }
+
+            //
+            // at this point in ActionInvocationFacetFDEA, the action is optionally published via the
+            // PublishingServiceInternal.  However, we currently do not support the concept of publishing simple
+            // property modifications.
+            //
+        }
     }
 
     private Class<? extends PropertyDomainEvent<?, ?>> eventType() {
@@ -118,4 +200,37 @@ public abstract class PropertySetterFacetForDomainEventAbstract
         return event;
     }
 
+
+
+    private ServicesInjector getServicesInjector() {
+        return servicesInjector;
+    }
+
+    private CommandContext getCommandContext() {
+        return lookupService(CommandContext.class);
+    }
+
+    private InteractionContext getInteractionContext() {
+        return lookupService(InteractionContext.class);
+    }
+
+    private CommandService getCommandService() {
+        return lookupService(CommandService.class);
+    }
+
+    private ClockService getClockService() {
+        return lookupService(ClockService.class);
+    }
+
+    private <T> T lookupService(final Class<T> serviceClass) {
+        T service = lookupServiceIfAny(serviceClass);
+        if(service == null) {
+            throw new IllegalStateException("The '" + serviceClass.getName() + "' service is not registered!");
+        }
+        return service;
+    }
+    private <T> T lookupServiceIfAny(final Class<T> serviceClass) {
+        return getServicesInjector().lookupService(serviceClass);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertyModifyFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertyModifyFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertyModifyFacetFactory.java
index 2495356..907e1b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertyModifyFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertyModifyFacetFactory.java
@@ -64,7 +64,7 @@ public class PropertyModifyFacetFactory extends MethodPrefixBasedFacetFactoryAbs
         processMethodContext.removeMethod(modifyMethod);
 
         final FacetHolder property = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new PropertySetterFacetViaModifyMethod(modifyMethod, property, servicesInjector));
+        FacetUtil.addFacet(new PropertySetterFacetViaModifyMethod(modifyMethod, property));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacet.java
index 7d437bc..84670b5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacet.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.properties.update.clear;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 /**
  * Mechanism for clearing a property of an object (that is, setting it to
@@ -35,5 +36,8 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface PropertyClearFacet extends Facet {
 
-    public void clearProperty(ObjectAdapter inObject, final InteractionInitiatedBy interactionInitiatedBy);
+    void clearProperty(
+            final OneToOneAssociation owningProperty,
+            final ObjectAdapter targetAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy);
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
index ac79dc4..3f4e29a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public class PropertyClearFacetViaClearMethod extends PropertyClearFacetAbstract implements ImperativeFacet {
 
@@ -52,8 +53,11 @@ public class PropertyClearFacetViaClearMethod extends PropertyClearFacetAbstract
     }
 
     @Override
-    public void clearProperty(final ObjectAdapter owningAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
+    public void clearProperty(
+            final OneToOneAssociation owningProperty,
+            final ObjectAdapter targetAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        ObjectAdapter.InvokeUtils.invoke(method, targetAdapter);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
index 99baf75..4772389 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public class PropertyClearFacetViaSetterMethod extends PropertyClearFacetAbstract implements ImperativeFacet {
 
@@ -52,8 +53,11 @@ public class PropertyClearFacetViaSetterMethod extends PropertyClearFacetAbstrac
     }
 
     @Override
-    public void clearProperty(final ObjectAdapter owningAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
+    public void clearProperty(
+            final OneToOneAssociation owningProperty,
+            final ObjectAdapter targetAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        ObjectAdapter.InvokeUtils.invoke(method, targetAdapter);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacet.java
index d76fe2a..c018807 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacet.java
@@ -41,7 +41,7 @@ public interface PropertySetterFacet extends Facet {
     /**
      * Sets the value of this property.
      */
-    public void setProperty(
+    void setProperty(
             final OneToOneAssociation owningAssociation,
             final ObjectAdapter inObject,
             final ObjectAdapter value,

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
index 137a63c..91dc8aa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
@@ -23,27 +23,21 @@ import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.services.command.Command;
-import org.apache.isis.applib.services.command.CommandContext;
-import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstract implements ImperativeFacet {
 
     private final Method method;
-    private final ServicesInjector servicesInjector;
 
-    public PropertySetterFacetViaModifyMethod(final Method method, final FacetHolder holder, final ServicesInjector servicesInjector) {
+    public PropertySetterFacetViaModifyMethod(
+            final Method method,
+            final FacetHolder holder) {
         super(holder);
         this.method = method;
-        this.servicesInjector = servicesInjector;
     }
 
     /**
@@ -62,46 +56,14 @@ public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstr
 
     @Override
     public void setProperty(
-            final OneToOneAssociation owningAssociation, final ObjectAdapter targetAdapter,
+            final OneToOneAssociation owningAssociation,
+            final ObjectAdapter targetAdapter,
             final ObjectAdapter valueAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        owningAssociation.setupCommand(targetAdapter, valueAdapter);
-
-        invokeThruCommand(owningAssociation, targetAdapter, valueAdapter);
-
+        ObjectAdapter.InvokeUtils.invoke(method, targetAdapter, valueAdapter);
     }
 
-    private void invokeThruCommand(
-            final OneToOneAssociation owningAssociation,
-            final ObjectAdapter targetAdapter,
-            final ObjectAdapter valueAdapter) {
-
-        // TODO: refactor to be the same as ActionInvocationFacetFDEA
-
-        final Object target = ObjectAdapter.Util.unwrap(targetAdapter);
-        final Object argValue = ObjectAdapter.Util.unwrap(valueAdapter);
-
-        final String propertyId = owningAssociation.getIdentifier().toClassAndNameIdentityString();
-
-        final Interaction.PropertyArgs propertyArgs =
-                new Interaction.PropertyArgs(propertyId, target, argValue);
-
-        final CommandContext commandContext = getCommandContext();
-        final Command command = commandContext.getCommand();
-
-        final InteractionContext interactionContext = getInteractionContext();
-        final Interaction interaction = interactionContext.getInteraction();
-
-        final Interaction.MemberCallable<?> callable =
-                new Interaction.MemberCallable<Interaction.PropertyArgs>() {
-                    @Override public Object call(final Interaction.PropertyArgs propertyArgs11) {
-                        return ObjectAdapter.InvokeUtils.invoke(method, targetAdapter, valueAdapter);
-                    }
-                };
-
-        interaction.execute(callable, propertyArgs, getClockService(), command);
-    }
 
     @Override
     protected String toStringValues() {
@@ -109,32 +71,6 @@ public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstr
     }
 
 
-    private ServicesInjector getServicesInjector() {
-        return servicesInjector;
-    }
-
-    private CommandContext getCommandContext() {
-        return lookupService(CommandContext.class);
-    }
-
-    private InteractionContext getInteractionContext() {
-        return lookupService(InteractionContext.class);
-    }
-
-    private ClockService getClockService() {
-        return lookupService(ClockService.class);
-    }
-
-    private <T> T lookupService(final Class<T> serviceClass) {
-        T service = lookupServiceIfAny(serviceClass);
-        if(service == null) {
-            throw new IllegalStateException("The '" + serviceClass.getName() + "' service is not registered!");
-        }
-        return service;
-    }
-    private <T> T lookupServiceIfAny(final Class<T> serviceClass) {
-        return getServicesInjector().lookupService(serviceClass);
-    }
 
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
index d0bd8e9..a4e0dc5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
@@ -54,7 +54,8 @@ public class PropertySetterFacetViaSetterMethod extends PropertySetterFacetAbstr
 
     @Override
     public void setProperty(
-            final OneToOneAssociation owningAssociation, final ObjectAdapter adapter,
+            final OneToOneAssociation owningAssociation,
+            final ObjectAdapter adapter,
             final ObjectAdapter valueAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         ObjectAdapter.InvokeUtils.invoke(method, adapter, valueAdapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandMementoService.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandMementoService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandMementoService.java
index 156ecb9..faacb02 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandMementoService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/command/CommandMementoService.java
@@ -54,14 +54,14 @@ public interface CommandMementoService {
             final ObjectAdapter[] argAdapters);
 
     /**
-     * Returns a JAXB DTO (hence convertible to XML) that represents the intention to edit a property on
+     * Returns a JAXB DTO (hence convertible to XML) that represents the intention to edit (set or clear) a property on
      * a target.  The property can be a mixin or contributed.
      */
     @Programmatic
     CommandMementoDto asCommandMemento(
             final ObjectAdapter targetAdapter,
             final OneToOneAssociation association,
-            final ObjectAdapter valueAdapter);
+            final ObjectAdapter valueAdapterOrNull);
 
     @Programmatic
     void addActionArgs(

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index ef6acbd..5c17de6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -231,7 +231,7 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
             final ObjectAdapter ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         final PropertyClearFacet facet = getFacet(PropertyClearFacet.class);
-        facet.clearProperty(ownerAdapter, interactionInitiatedBy);
+        facet.clearProperty(this, ownerAdapter, interactionInitiatedBy);
     }
 
     //endregion
@@ -330,11 +330,11 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
     @Override
     public void setupCommand(
             final ObjectAdapter targetAdapter,
-            final ObjectAdapter valueAdapter) {
+            final ObjectAdapter valueAdapterOrNull) {
 
-        setupCommandTarget(targetAdapter, valueAdapter);
+        setupCommandTarget(targetAdapter, valueAdapterOrNull);
         setupCommandMemberIdentifier();
-        setupCommandMementoAndExecutionContext(targetAdapter, valueAdapter);
+        setupCommandMementoAndExecutionContext(targetAdapter, valueAdapterOrNull);
     }
 
     protected void setupCommandTarget(
@@ -348,10 +348,10 @@ public class OneToOneAssociationDefault extends ObjectAssociationAbstract implem
 
     protected void setupCommandMementoAndExecutionContext(
             final ObjectAdapter targetAdapter,
-            final ObjectAdapter valueAdapter) {
+            final ObjectAdapter valueAdapterOrNull) {
 
         final CommandMementoService commandMementoService = getCommandMementoService();
-        final CommandMementoDto dto = commandMementoService.asCommandMemento(targetAdapter, this, valueAdapter);
+        final CommandMementoDto dto = commandMementoService.asCommandMemento(targetAdapter, this, valueAdapterOrNull);
 
         setupCommandMementoAndExecutionContext(dto);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index d644a0a..347c273 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -156,7 +156,7 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
             FacetUtil.addFacet(new PropertyClearFacetAbstract(holder) {
                 @Override
                 public void clearProperty(
-                        final ObjectAdapter inObject,
+                        final OneToOneAssociation owningProperty, final ObjectAdapter targetAdapter,
                         final InteractionInitiatedBy interactionInitiatedBy) {
                 }
             });

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandMementoServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandMementoServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandMementoServiceDefault.java
index 8db796c..bab2aee 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandMementoServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/command/CommandMementoServiceDefault.java
@@ -169,7 +169,7 @@ public class CommandMementoServiceDefault implements CommandMementoService {
     public CommandMementoDto asCommandMemento(
             final ObjectAdapter targetAdapter,
             final OneToOneAssociation association,
-            final ObjectAdapter valueAdapter) {
+            final ObjectAdapter valueAdapterOrNull) {
 
         // TODO.  introduce a choice for aim vs pmm, in the cmd.xsd
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6341730e/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
index e5d488f..ae682f5 100644
--- a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
+++ b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
@@ -334,7 +334,7 @@ public class WrapperFactoryDefaultTest_wrappedObject {
                 mockAuthenticationSessionProvider, mockAdapterManager
         ));
         FacetUtil.addFacet(new PropertyInitializationFacetViaSetterMethod(init, facetedMethod));
-        FacetUtil.addFacet(new PropertySetterFacetViaModifyMethod(modify, facetedMethod, null));
+        FacetUtil.addFacet(new PropertySetterFacetViaModifyMethod(modify, facetedMethod));
         FacetUtil.addFacet(new PropertyClearFacetViaClearMethod(clear, facetedMethod));
         FacetUtil.addFacet(new HideForContextFacetViaMethod(hide, facetedMethod));
         FacetUtil.addFacet(new DisableForContextFacetViaMethod(disable, null, null, facetedMethod));