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 2014/05/11 19:42:00 UTC

[15/16] ISIS-550: refactored DomainObjectInvocationHandler and ImperativeFacets

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/ClearDirtyObjectFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/ClearDirtyObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/ClearDirtyObjectFacetViaMethod.java
index 3f97714..1e0172c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/ClearDirtyObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/ClearDirtyObjectFacetViaMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.progmodel.facets.object.dirty.ClearDirtyObjectFacetAbstract;
 
 public class ClearDirtyObjectFacetViaMethod extends ClearDirtyObjectFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class ClearDirtyObjectFacetViaMethod extends ClearDirtyObjectFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/IsDirtyObjectFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/IsDirtyObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/IsDirtyObjectFacetViaMethod.java
index 355cfeb..c8c5e32 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/IsDirtyObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/IsDirtyObjectFacetViaMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.progmodel.facets.object.dirty.IsDirtyObjectFacetAbstract;
 
 public class IsDirtyObjectFacetViaMethod extends IsDirtyObjectFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class IsDirtyObjectFacetViaMethod extends IsDirtyObjectFacetAbstract impl
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/MarkDirtyObjectFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/MarkDirtyObjectFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/MarkDirtyObjectFacetViaMethod.java
index f1ee36e..21d24bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/MarkDirtyObjectFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/dirty/method/MarkDirtyObjectFacetViaMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.progmodel.facets.object.dirty.MarkDirtyObjectFacetAbstract;
 
 public class MarkDirtyObjectFacetViaMethod extends MarkDirtyObjectFacetAbstract implements ImperativeFacet {
@@ -44,6 +45,11 @@ public class MarkDirtyObjectFacetViaMethod extends MarkDirtyObjectFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/disabled/method/DisabledObjectFacetViaDisabledMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/disabled/method/DisabledObjectFacetViaDisabledMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/disabled/method/DisabledObjectFacetViaDisabledMethod.java
index d11f3fc..224ae14 100755
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/disabled/method/DisabledObjectFacetViaDisabledMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/disabled/method/DisabledObjectFacetViaDisabledMethod.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.progmodel.facets.object.disabled.DisabledObjectFacetAbstract;
 
 public class DisabledObjectFacetViaDisabledMethod extends DisabledObjectFacetAbstract implements ImperativeFacet {
@@ -47,6 +48,11 @@ public class DisabledObjectFacetViaDisabledMethod extends DisabledObjectFacetAbs
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHECK_IF_DISABLED;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaTitleMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaTitleMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaTitleMethod.java
index ed535b1..f03dc5d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaTitleMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaTitleMethod.java
@@ -31,6 +31,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 
 public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements ImperativeFacet {
@@ -53,6 +54,11 @@ public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements Impe
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.UI_HINT;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaToStringMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaToStringMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaToStringMethod.java
index e73c281..3fb7bbd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaToStringMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/title/TitleFacetViaToStringMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 
 public class TitleFacetViaToStringMethod extends TitleFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class TitleFacetViaToStringMethod extends TitleFacetAbstract implements I
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.UI_HINT;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validate/method/ValidateObjectFacetViaValidateMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validate/method/ValidateObjectFacetViaValidateMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validate/method/ValidateObjectFacetViaValidateMethod.java
index 65d7dbf..1ddcda3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validate/method/ValidateObjectFacetViaValidateMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/validate/method/ValidateObjectFacetViaValidateMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.progmodel.facets.object.validate.ValidateObjectFacetAbstract;
 
 public class ValidateObjectFacetViaValidateMethod extends ValidateObjectFacetAbstract implements ImperativeFacet {
@@ -44,6 +45,11 @@ public class ValidateObjectFacetViaValidateMethod extends ValidateObjectFacetAbs
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHECK_IF_VALID;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetViaMethod.java
index 2217227..34ad250 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/autocomplete/ActionParameterAutoCompleteFacetViaMethod.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.progmodel.facets.CollectionUtils;
@@ -56,6 +57,11 @@ public class ActionParameterAutoCompleteFacetViaMethod extends ActionParameterAu
     }
     
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHOICES_OR_AUTOCOMPLETE;
+    }
+
+    @Override
     public int getMinLength() {
         return minLength;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
index 569a35b..628dca3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
@@ -60,6 +60,11 @@ public class ActionChoicesFacetViaMethod extends ActionChoicesFacetAbstract impl
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHOICES_OR_AUTOCOMPLETE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index 068c20f..3024ad4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.progmodel.facets.CollectionUtils;
@@ -55,6 +56,11 @@ public class ActionParameterChoicesFacetViaMethod extends ActionParameterChoices
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHOICES_OR_AUTOCOMPLETE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
index 6832806..0f573eb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.progmodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 
 public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaultsFacetAbstract implements ImperativeFacet {
@@ -51,6 +52,11 @@ public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaul
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.DEFAULTS;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
index 6b7002f..2fc316a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacetAbstract;
 
 public class PropertyAccessorFacetViaAccessor extends PropertyOrCollectionAccessorFacetAbstract implements ImperativeFacet {
@@ -49,6 +50,11 @@ public class PropertyAccessorFacetViaAccessor extends PropertyOrCollectionAccess
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.ACCESSOR;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/autocomplete/PropertyAutoCompleteFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/autocomplete/PropertyAutoCompleteFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/autocomplete/PropertyAutoCompleteFacetViaMethod.java
index 88116ed..b3ac280 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/autocomplete/PropertyAutoCompleteFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/autocomplete/PropertyAutoCompleteFacetViaMethod.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.progmodel.facets.CollectionUtils;
@@ -62,6 +63,11 @@ public class PropertyAutoCompleteFacetViaMethod extends PropertyAutoCompleteFace
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHOICES_OR_AUTOCOMPLETE;
+    }
+
+    @Override
     public int getMinLength() {
         return minLength;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
index cb2b694..d752f3f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.progmodel.facets.CollectionUtils;
@@ -58,6 +59,11 @@ public class PropertyChoicesFacetViaMethod extends PropertyChoicesFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHOICES_OR_AUTOCOMPLETE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
index b5a1610..35a2294 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.progmodel.facets.properties.defaults.PropertyDefaultFacetAbstract;
@@ -56,6 +57,11 @@ public class PropertyDefaultFacetViaMethod extends PropertyDefaultFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.DEFAULTS;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/Helper.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/Helper.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/Helper.java
new file mode 100644
index 0000000..de4cdac
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/Helper.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.properties.event;
+
+import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+class Helper {
+
+    private final ServicesInjector servicesInjector;
+
+    private EventBusService eventBusService;
+    private boolean searchedForEventBusService = false;
+
+    public Helper(final ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
+    }
+
+    void postEvent(final PropertyChangedEvent<?, ?> event) {
+        eventBusService.post(event);
+    }
+
+    EventBusService getEventBusService() {
+        if (!searchedForEventBusService) {
+            eventBusService = this.servicesInjector.lookupService(EventBusService.class);
+        }
+        searchedForEventBusService = true;
+        return eventBusService;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
index 89bd745..98eb385 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
@@ -26,17 +26,14 @@ import java.util.List;
 import org.apache.isis.applib.annotation.PostsPropertyChangedEvent;
 import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.adapter.ServicesProvider;
-import org.apache.isis.core.metamodel.adapter.ServicesProviderAware;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
-import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventFacet;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
@@ -60,38 +57,28 @@ public class PostsPropertyChangedEventAnnotationFacetFactory extends FacetFactor
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
-        FacetUtil.addFacet(create(method, processMethodContext.getFacetHolder()));
-    }
-
-    private PostsPropertyChangedEventFacet create(Method method, final FacetHolder holder) {
+        FacetedMethod holder = processMethodContext.getFacetHolder();
+        
         final PostsPropertyChangedEvent annotation = Annotations.getAnnotation(method, PostsPropertyChangedEvent.class);
         if(annotation == null) {
-            return null;
+            return;
         }
         final PropertyOrCollectionAccessorFacet getterFacet = holder.getFacet(PropertyOrCollectionAccessorFacet.class);
         if(getterFacet == null) {
-            return null;
+            return;
         } 
-        final PropertyClearFacet clearFacet = holder.getFacet(PropertyClearFacet.class);
-        final PropertySetterFacet setterFacet = holder.getFacet(PropertySetterFacet.class);
-        if (clearFacet == null && setterFacet == null) {
-            return null;
-        }
         
-        
-        // REVIEW: I'm a bit uncertain about this; this facet is multi-valued, but the setUnderlying(...) stuff only
-        // works for single valued types.
-        // the wrapperFactory stuff looks for underlying to find the imperative method, I think this only works in this
-        // case because (by accident rather than design) there is also the PropertyInitializationFacet wrapping the setter.
+        final PropertySetterFacet setterFacet = holder.getFacet(PropertySetterFacet.class);
         if(setterFacet != null) {
-            holder.removeFacet(setterFacet);
+            final Class<? extends PropertyChangedEvent<?, ?>> changedEventType = annotation.value();
+            FacetUtil.addFacet(new PostsPropertyChangedEventSetterFacetAnnotation(changedEventType, getterFacet, setterFacet, servicesInjector, holder));
         }
+        
+        final PropertyClearFacet clearFacet = holder.getFacet(PropertyClearFacet.class);
         if(clearFacet != null) {
-            holder.removeFacet(clearFacet);
+            final Class<? extends PropertyChangedEvent<?, ?>> changedEventType = annotation.value();
+            FacetUtil.addFacet(new PostsPropertyChangedEventClearFacetAnnotation(changedEventType, getterFacet, clearFacet, servicesInjector, holder));
         }
-        
-        final Class<? extends PropertyChangedEvent<?, ?>> changedEventType = annotation.value();
-        return new PostsPropertyChangedEventFacetAnnotation(changedEventType, getterFacet, setterFacet, clearFacet, servicesInjector, holder);
     }
 
     // //////////////////////////////////////
@@ -128,5 +115,4 @@ public class PostsPropertyChangedEventAnnotationFacetFactory extends FacetFactor
         this.servicesInjector = servicesInjector;
     }
 
-    
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventClearFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventClearFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventClearFacetAnnotation.java
new file mode 100644
index 0000000..0dff445
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventClearFacetAnnotation.java
@@ -0,0 +1,118 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.properties.event;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.FatalException;
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventClearFacet;
+import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventClearFacetAbstract;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PostsPropertyChangedEventClearFacetAnnotation 
+        extends PostsPropertyChangedEventClearFacetAbstract {
+
+    private final PropertyOrCollectionAccessorFacet getterFacet;
+    private final PropertyClearFacet clearFacet;
+    private final Helper helper;
+    
+    public PostsPropertyChangedEventClearFacetAnnotation(
+            final Class<? extends PropertyChangedEvent<?, ?>> eventType, 
+            final PropertyOrCollectionAccessorFacet getterFacet, 
+            final PropertyClearFacet clearFacet, 
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, holder);
+        this.getterFacet = getterFacet;
+        this.clearFacet = clearFacet;
+        this.helper = new Helper(servicesInjector);
+    }
+
+    @Override
+    public void clearProperty(ObjectAdapter targetAdapter) {
+        if(clearFacet == null) {
+            return;
+        }
+
+        if(helper.getEventBusService() == null) {
+            clearFacet.clearProperty(targetAdapter);
+            return;
+        }
+
+        final Object oldValue = getterFacet.getProperty(targetAdapter);
+        clearFacet.clearProperty(targetAdapter);
+        final Object newValue = getterFacet.getProperty(targetAdapter);
+        
+        postEventIfChanged(targetAdapter, getIdentified().getIdentifier(), oldValue, newValue);
+    }
+
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private void postEventIfChanged(
+            final ObjectAdapter targetAdapter, 
+            final Identifier identifier, 
+            final Object oldValue, 
+            final Object newValue) {
+        
+        if(Objects.equal(oldValue, newValue)) {
+            // do nothing.
+            return;
+        }
+        try {
+            final Class type = value();
+            final Object source = ObjectAdapter.Util.unwrap(targetAdapter);
+            final PropertyChangedEvent<?, ?> event = Util.newEvent(type, source, identifier, oldValue, newValue);
+            
+            helper.postEvent(event);
+        } catch (Exception e) {
+            throw new FatalException(e);
+        }
+    }
+
+    // //////////////////////////////////////
+    // MultiTypedFacet
+    // //////////////////////////////////////
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Class<? extends Facet>[] facetTypes() {
+        return Lists.newArrayList(
+                    type(),
+                    PostsPropertyChangedEventClearFacet.class
+                ).toArray(new Class[]{});
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Facet> T getFacet(Class<T> facet) {
+        return (T) this;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
deleted file mode 100644
index db67de1..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.progmodel.facets.properties.event;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.FatalException;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ServicesProvider;
-import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventFacet;
-import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventFacetAbstract;
-import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
-import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-
-public class PostsPropertyChangedEventFacetAnnotation extends PostsPropertyChangedEventFacetAbstract {
-
-    private final PropertyOrCollectionAccessorFacet getterFacet;
-    private final PropertySetterFacet setterFacet;
-    private final PropertyClearFacet clearFacet;
-    private final ServicesInjector servicesInjector;
-    
-    private EventBusService eventBusService;
-    private boolean searchedForEventBusService = false;
-
-    public PostsPropertyChangedEventFacetAnnotation(
-            final Class<? extends PropertyChangedEvent<?, ?>> eventType, 
-            final PropertyOrCollectionAccessorFacet getterFacet, 
-            final PropertySetterFacet setterFacet, 
-            final PropertyClearFacet clearFacet, 
-            final ServicesInjector servicesInjector,
-            final FacetHolder holder) {
-        super(eventType, holder);
-        this.getterFacet = getterFacet;
-        this.setterFacet = setterFacet;
-        this.clearFacet = clearFacet;
-        this.servicesInjector = servicesInjector;
-    }
-
-    @Override
-    public void setProperty(ObjectAdapter targetAdapter, ObjectAdapter valueAdapter) {
-        if(setterFacet == null) {
-            return;
-        }
-        eventBusService = getEventBusService();
-        if(eventBusService == null) {
-            setterFacet.setProperty(targetAdapter, valueAdapter);
-            return;
-        }
-        
-        final Object oldValue = getterFacet.getProperty(targetAdapter);
-        setterFacet.setProperty(targetAdapter, valueAdapter);
-        final Object newValue = getterFacet.getProperty(targetAdapter);
-        postEventIfChanged(targetAdapter, getIdentified().getIdentifier(), oldValue, newValue);
-    }
-
-    @Override
-    public void clearProperty(ObjectAdapter targetAdapter) {
-        if(clearFacet == null) {
-            return;
-        }
-        eventBusService = getEventBusService();
-        if(eventBusService == null) {
-            clearFacet.clearProperty(targetAdapter);
-            return;
-        }
-
-        final Object oldValue = getterFacet.getProperty(targetAdapter);
-        clearFacet.clearProperty(targetAdapter);
-        final Object newValue = getterFacet.getProperty(targetAdapter);
-        
-        postEventIfChanged(targetAdapter, getIdentified().getIdentifier(), oldValue, newValue);
-    }
-
-
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    private void postEventIfChanged(
-            final ObjectAdapter targetAdapter, 
-            final Identifier identifier, 
-            final Object oldValue, 
-            final Object newValue) {
-        
-        if(Objects.equal(oldValue, newValue)) {
-            // do nothing.
-            return;
-        }
-        try {
-            final Class type = value();
-            final Object source = ObjectAdapter.Util.unwrap(targetAdapter);
-            final PropertyChangedEvent<?, ?> event = Util.newEvent(type, source, identifier, oldValue, newValue);
-            
-            eventBusService.post(event);
-        } catch (Exception e) {
-            throw new FatalException(e);
-        }
-    }
-
-    private EventBusService getEventBusService() {
-        if (!searchedForEventBusService) {
-            eventBusService = this.servicesInjector.lookupService(EventBusService.class);
-        }
-        searchedForEventBusService = true;
-        return eventBusService;
-    }
-    
-    // //////////////////////////////////////
-    // MultiTypedFacet
-    // //////////////////////////////////////
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Class<? extends Facet>[] facetTypes() {
-        return Lists.newArrayList(
-                    PostsPropertyChangedEventFacet.class, 
-                    PropertySetterFacet.class, 
-                    PropertyClearFacet.class
-                ).toArray(new Class[]{});
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Facet> T getFacet(Class<T> facet) {
-        return (T) this;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAnnotation.java
new file mode 100644
index 0000000..23647b2
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAnnotation.java
@@ -0,0 +1,117 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.properties.event;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.FatalException;
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventSetterFacet;
+import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventSetterFacetAbstract;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PostsPropertyChangedEventSetterFacetAnnotation 
+        extends PostsPropertyChangedEventSetterFacetAbstract {
+
+    private final PropertyOrCollectionAccessorFacet getterFacet;
+    private final PropertySetterFacet setterFacet;
+    
+    private final Helper helper;
+    
+    public PostsPropertyChangedEventSetterFacetAnnotation(
+            final Class<? extends PropertyChangedEvent<?, ?>> eventType, 
+            final PropertyOrCollectionAccessorFacet getterFacet, 
+            final PropertySetterFacet setterFacet, 
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, holder);
+        this.getterFacet = getterFacet;
+        this.setterFacet = setterFacet;
+        this.helper = new Helper(servicesInjector);
+    }
+
+    @Override
+    public void setProperty(ObjectAdapter targetAdapter, ObjectAdapter valueAdapter) {
+        if(setterFacet == null) {
+            return;
+        }
+        if(helper.getEventBusService() == null) {
+            setterFacet.setProperty(targetAdapter, valueAdapter);
+            return;
+        }
+        
+        final Object oldValue = getterFacet.getProperty(targetAdapter);
+        setterFacet.setProperty(targetAdapter, valueAdapter);
+        final Object newValue = getterFacet.getProperty(targetAdapter);
+        postEventIfChanged(targetAdapter, getIdentified().getIdentifier(), oldValue, newValue);
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private void postEventIfChanged(
+            final ObjectAdapter targetAdapter, 
+            final Identifier identifier, 
+            final Object oldValue, 
+            final Object newValue) {
+        
+        if(Objects.equal(oldValue, newValue)) {
+            // do nothing.
+            return;
+        }
+        try {
+            final Class type = value();
+            final Object source = ObjectAdapter.Util.unwrap(targetAdapter);
+            final PropertyChangedEvent<?, ?> event = Util.newEvent(type, source, identifier, oldValue, newValue);
+
+            helper.postEvent(event);
+        } catch (Exception e) {
+            throw new FatalException(e);
+        }
+    }
+
+    
+    // //////////////////////////////////////
+    // MultiTypedFacet
+    // //////////////////////////////////////
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Class<? extends Facet>[] facetTypes() {
+        return Lists.newArrayList(
+                    type(),
+                    PostsPropertyChangedEventSetterFacet.class
+                ).toArray(new Class[]{});
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Facet> T getFacet(Class<T> facet) {
+        return (T) this;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java
index 1b2a84e..ec4bde6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacetAbstract;
 
 public class PropertyClearFacetViaClearMethod extends PropertyClearFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class PropertyClearFacetViaClearMethod extends PropertyClearFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_PROPERTY_SUPPORTING;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java
index 9cde05d..de6bf15 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacetAbstract;
 
 public class PropertyClearFacetViaSetterMethod extends PropertyClearFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class PropertyClearFacetViaSetterMethod extends PropertyClearFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_PROPERTY;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyInitializationFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyInitializationFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyInitializationFacetViaSetterMethod.java
index 4b86ad8..9710320 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyInitializationFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyInitializationFacetViaSetterMethod.java
@@ -47,6 +47,13 @@ public class PropertyInitializationFacetViaSetterMethod extends PropertyInitiali
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        // LIMITATION: we cannot distinguish between setXxx being called for a modify or for an initialization
+        // so we just assume its a setter.
+        return Intent.MODIFY_PROPERTY;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java
index f37ee09..4d99e81 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacetAbstract;
 
 public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstr
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_PROPERTY_SUPPORTING;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java
index 660d241..6688deb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacetAbstract;
 
 public class PropertySetterFacetViaSetterMethod extends PropertySetterFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class PropertySetterFacetViaSetterMethod extends PropertySetterFacetAbstr
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_PROPERTY;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/validate/PropertyValidateFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/validate/PropertyValidateFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/validate/PropertyValidateFacetViaMethod.java
index 0df3e71..1f9718a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/validate/PropertyValidateFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/validate/PropertyValidateFacetViaMethod.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 
 public class PropertyValidateFacetViaMethod extends PropertyValidateFacetAbstract implements ImperativeFacet {
 
@@ -47,6 +48,11 @@ public class PropertyValidateFacetViaMethod extends PropertyValidateFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHECK_IF_VALID;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtilsTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtilsTest.java
index feee4dd..459484e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtilsTest.java
@@ -102,7 +102,7 @@ public class ImperativeFacetUtilsTest {
                 will(returnValue(Lists.newArrayList()));
             }
         });
-        final ImperativeFacet.Flags flags = ImperativeFacet.Util.getImperativeFacetFlags(mockObjectMember, method);
+        final ImperativeFacet.Flags flags = ImperativeFacet.Util.getFlags(mockObjectMember, method);
         assertThat(flags, is(not(nullValue())));
         assertThat(flags.impliesResolve(), is(false));
         assertThat(flags.impliesObjectChanged(), is(false));
@@ -117,7 +117,7 @@ public class ImperativeFacetUtilsTest {
                 will(returnValue(Lists.newArrayList((Facet) mockImperativeFacet)));
             }
         });
-        final ImperativeFacet.Flags flags = ImperativeFacet.Util.getImperativeFacetFlags(mockObjectMember, method);
+        final ImperativeFacet.Flags flags = ImperativeFacet.Util.getFlags(mockObjectMember, method);
         assertThat(flags, is(not(nullValue())));
         // TODO: need more tests here, these don't go deep enough...
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet_UtilTest_newEvent.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet_UtilTest_newEvent.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet_UtilTest_newEvent.java
index 2f554fe..c67013d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet_UtilTest_newEvent.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet_UtilTest_newEvent.java
@@ -24,7 +24,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
-import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventFacetAbstract;
+import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventSetterFacetAbstract;
 
 public class PostsPropertyChangedEventFacet_UtilTest_newEvent {
 
@@ -46,7 +46,7 @@ public class PostsPropertyChangedEventFacet_UtilTest_newEvent {
         LocalDate newValue = new LocalDate(2013,5,2);
         
         final PropertyChangedEvent<Object, Object> ev = 
-                PostsPropertyChangedEventFacet.Util.newEvent(PropertyChangedEvent.Default.class, sdo, identifier, oldValue, newValue);
+                PostsPropertyChangedEventSetterFacet.Util.newEvent(PropertyChangedEvent.Default.class, sdo, identifier, oldValue, newValue);
         assertThat(ev.getSource(), is((Object)sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOldValue(), is((Object)oldValue));
@@ -63,7 +63,7 @@ public class PostsPropertyChangedEventFacet_UtilTest_newEvent {
         LocalDate newValue = new LocalDate(2013,5,2);
         
         final PropertyChangedEvent<SomeDomainObject, LocalDate> ev = 
-                PostsPropertyChangedEventFacet.Util.newEvent(SomeDatePropertyChangedEvent.class, sdo, identifier, oldValue, newValue);
+                PostsPropertyChangedEventSetterFacet.Util.newEvent(SomeDatePropertyChangedEvent.class, sdo, identifier, oldValue, newValue);
         assertThat(ev.getSource(), is(sdo));
         assertThat(ev.getIdentifier(), is(identifier));
         assertThat(ev.getOldValue(), is(oldValue));

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
index f689a55..955fb7f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
 public class EventBusServiceDefault extends EventBusService {
-
     
     private final Set<Object> objectsToRegister = Sets.newHashSet();
     
@@ -52,12 +51,14 @@ public class EventBusServiceDefault extends EventBusService {
     }
 
     public void open() {
+        final Set<Object> objectsToRegister = this.objectsToRegister;
         for (final Object object : objectsToRegister) {
             getEventBus().register(object);
         }
     }
 
     public void close() {
+        final Set<Object> objectsToRegister = this.objectsToRegister;
         for (final Object object : objectsToRegister) {
             getEventBus().unregister(object);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index 0c2a6c8..9cdddb5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -240,13 +240,7 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
 
         final List<Object> registeredServices = servicesInjector.getRegisteredServices();
         
-        startRequestOnRequestScopedServices(registeredServices);
-
-        createCommandIfConfigured();
-        
         createServiceAdapters(registeredServices);
-        
-        initOtherApplibServicesIfConfigured(registeredServices);
     }
 
     /**
@@ -274,67 +268,6 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
         }
     }
 
-    private void initOtherApplibServicesIfConfigured(final List<Object> registeredServices) {
-        
-        final EventBusServiceDefault ebsd = getServiceOrNull(EventBusServiceDefault.class);
-        if(ebsd != null) {
-            ebsd.open();
-        }
-        
-        final Bulk.InteractionContext bic = getServiceOrNull(Bulk.InteractionContext.class);
-        if(bic != null) {
-            Bulk.InteractionContext.current.set(bic);
-        }
-        
-    }
-
-    private void startRequestOnRequestScopedServices(final List<Object> registeredServices) {
-        for (final Object service : registeredServices) {
-            if(service instanceof RequestScopedService) {
-                ((RequestScopedService)service).__isis_startRequest();
-            }
-        }
-    }
-
-    private void createCommandIfConfigured() {
-        final CommandContext commandContext = getServiceOrNull(CommandContext.class);
-        if(commandContext == null) {
-            return;
-        } 
-        final CommandService commandService = getServiceOrNull(CommandService.class);
-        final Command command = 
-                commandService != null 
-                    ? commandService.create() 
-                    : new CommandDefault();
-        commandContext.setCommand(command);
-
-        if(command.getTimestamp() == null) {
-            command.setTimestamp(Clock.getTimeAsJavaSqlTimestamp());
-        }
-        if(command.getUser() == null) {
-            command.setUser(getAuthenticationSession().getUserName());
-        }
-        
-        // the remaining properties are set further down the call-stack, if an action is actually performed
-    }
-
-
-    /**
-     * Called by IsisTransactionManager on start
-     */
-    public void startTransactionOnCommandIfConfigured(final UUID transactionId) {
-        final CommandContext commandContext = getServiceOrNull(CommandContext.class);
-        if(commandContext == null) {
-            return;
-        } 
-        final CommandService commandService = getServiceOrNull(CommandService.class);
-        if(commandService == null) {
-            return;
-        } 
-        final Command command = commandContext.getCommand();
-        commandService.startTransaction(command, transactionId);
-    }
-
 
     /**
      * @return - the service, or <tt>null</tt> if no service registered of specified type.
@@ -382,20 +315,10 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
             // ignore
         }
 
-        endRequestOnRequestScopeServices();
-        
         setState(State.CLOSED);
     }
 
 
-    private void endRequestOnRequestScopeServices() {
-        for (final Object service : servicesInjector.getRegisteredServices()) {
-            if(service instanceof RequestScopedService) {
-                ((RequestScopedService)service).__isis_endRequest();
-            }
-        }
-    }
-
     // ///////////////////////////////////////////////////////////////////////////
     // State Management
     // ///////////////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
index 1ac5b64..a7a9d17 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
@@ -27,16 +27,22 @@ import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 
 import java.util.List;
+import java.util.UUID;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;
+import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.services.audit.AuditingService3;
+import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.applib.services.command.CommandDefault;
+import org.apache.isis.applib.services.command.spi.CommandService;
 import org.apache.isis.applib.services.publish.EventPayload;
 import org.apache.isis.applib.services.publish.EventPayloadForActionInvocation;
 import org.apache.isis.applib.services.publish.EventPayloadForObjectChanged;
@@ -53,6 +59,8 @@ import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithDefaultPayloadFactories;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
+import org.apache.isis.core.runtime.services.RequestScopedService;
+import org.apache.isis.core.runtime.services.eventbus.EventBusServiceDefault;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSession;
@@ -262,7 +270,7 @@ public class IsisTransactionManager implements SessionScopedComponent {
     
 
     // //////////////////////////////////////////////////////
-    // start, flush, abort, end
+    // start
     // //////////////////////////////////////////////////////
 
     public synchronized void startTransaction() {
@@ -271,12 +279,18 @@ public class IsisTransactionManager implements SessionScopedComponent {
         if (getTransaction() == null || getTransaction().getState().isComplete()) {
             noneInProgress = true;
 
+            final List<Object> registeredServices = servicesInjector.getRegisteredServices();
+
+            startRequestOnRequestScopedServices(registeredServices);
+            createCommandIfConfigured();
+            initOtherApplibServicesIfConfigured(registeredServices);
+            
             IsisTransaction isisTransaction = createTransaction();
             transactionLevel = 0;
 
             transactionalResource.startTransaction();
-            
-            persistenceSession.startTransactionOnCommandIfConfigured(isisTransaction.getTransactionId());
+
+            startTransactionOnCommandIfConfigured(isisTransaction.getTransactionId());
         }
 
         transactionLevel++;
@@ -286,6 +300,88 @@ public class IsisTransactionManager implements SessionScopedComponent {
         }
     }
 
+    
+    private void initOtherApplibServicesIfConfigured(final List<Object> registeredServices) {
+        
+        final EventBusServiceDefault ebsd = getServiceOrNull(EventBusServiceDefault.class);
+        if(ebsd != null) {
+            ebsd.open();
+        }
+        
+        final Bulk.InteractionContext bic = getServiceOrNull(Bulk.InteractionContext.class);
+        if(bic != null) {
+            Bulk.InteractionContext.current.set(bic);
+        }
+        
+    }
+
+    private void startRequestOnRequestScopedServices(final List<Object> registeredServices) {
+        for (final Object service : registeredServices) {
+            if(service instanceof RequestScopedService) {
+                ((RequestScopedService)service).__isis_startRequest();
+            }
+        }
+    }
+
+    private void endRequestOnRequestScopeServices() {
+        for (final Object service : servicesInjector.getRegisteredServices()) {
+            if(service instanceof RequestScopedService) {
+                ((RequestScopedService)service).__isis_endRequest();
+            }
+        }
+    }
+
+    private void createCommandIfConfigured() {
+        final CommandContext commandContext = getServiceOrNull(CommandContext.class);
+        if(commandContext == null) {
+            return;
+        } 
+        final CommandService commandService = getServiceOrNull(CommandService.class);
+        final Command command = 
+                commandService != null 
+                    ? commandService.create() 
+                    : new CommandDefault();
+        commandContext.setCommand(command);
+
+        if(command.getTimestamp() == null) {
+            command.setTimestamp(Clock.getTimeAsJavaSqlTimestamp());
+        }
+        if(command.getUser() == null) {
+            command.setUser(getAuthenticationSession().getUserName());
+        }
+        
+        // the remaining properties are set further down the call-stack, if an action is actually performed
+    }
+
+    /**
+     * Called by IsisTransactionManager on start
+     */
+    public void startTransactionOnCommandIfConfigured(final UUID transactionId) {
+        final CommandContext commandContext = getServiceOrNull(CommandContext.class);
+        if(commandContext == null) {
+            return;
+        } 
+        final CommandService commandService = getServiceOrNull(CommandService.class);
+        if(commandService == null) {
+            return;
+        } 
+        final Command command = commandContext.getCommand();
+        commandService.startTransaction(command, transactionId);
+    }
+
+
+    /**
+     * @return - the service, or <tt>null</tt> if no service registered of specified type.
+     */
+    public <T> T getServiceOrNull(Class<T> serviceType) {
+        return servicesInjector.lookupService(serviceType);
+    }
+
+
+
+    // //////////////////////////////////////////////////////
+    // flush
+    // //////////////////////////////////////////////////////
 
     public synchronized boolean flushTransaction() {
 
@@ -300,6 +396,10 @@ public class IsisTransactionManager implements SessionScopedComponent {
         return false;
     }
 
+    // //////////////////////////////////////////////////////
+    // end, abort
+    // //////////////////////////////////////////////////////
+
     /**
      * Ends the transaction if nesting level is 0 (but will abort the transaction instead, 
      * even if nesting level is not 0, if an {@link IsisTransaction#getAbortCause() abort cause}
@@ -411,6 +511,8 @@ public class IsisTransactionManager implements SessionScopedComponent {
                 }
             }
             
+            
+            endRequestOnRequestScopeServices();
 
             if(abortCause != null) {
                 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
index 68eca35..baa6080 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
@@ -110,14 +110,8 @@ public class ObjectStoreTransactionManager_EndTransactionTest {
     public void endTransactionCommitsTransactionWhenLevelDecrementsDownToZero() throws Exception {
         // setup
         context.ignoring(mockObjectStore);
-        context.checking(new Expectations() {
-            {
-                oneOf(mockPersistenceSession).startTransactionOnCommandIfConfigured(with(any(UUID.class)));
-            }
-        });
         transactionManager.startTransaction();
 
-        
         context.checking(new Expectations() {
             {
                 oneOf(mockPersistenceSession).objectChangedAllDirty();
@@ -150,7 +144,7 @@ public class ObjectStoreTransactionManager_EndTransactionTest {
         context.checking(new Expectations() {
             {
                 final Sequence transactionOrdering = context.sequence("transactionOrdering");
-                one(mockObjectStore).startTransaction();
+                oneOf(mockObjectStore).startTransaction();
                 inSequence(transactionOrdering);
 
                 // flushed twice, once before publishing, once after

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
index 01b03a0..aa7b320 100644
--- a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -54,6 +54,7 @@ import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.DecoratingFacet;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
 import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.actions.choices.ActionChoicesFacet;
 import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
@@ -105,7 +106,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
     protected Method saveMethod;
 
     /**
-     * The <tt>underlying()</tt> method from {@link WrapperObject#wrapped()}.
+     * The <tt>wrapped()</tt> method from {@link WrapperObject#wrapped()}.
      */
     protected Method wrappedMethod;
 
@@ -150,7 +151,6 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         }
 
 
-
         final ObjectSpecification targetNoSpec = targetAdapter.getSpecification();
 
         // save method, through the proxy
@@ -158,81 +158,65 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
             return handleSaveMethod(getAuthenticationSession(), targetAdapter, targetNoSpec);
         }
 
-        if (isUnderlyingMethod(method)) {
+        if (isWrappedMethod(method)) {
             return getDelegate();
         }
 
         final ObjectMember objectMember = locateAndCheckMember(method);
-        final List<Facet> imperativeFacets = getImperativeFacets(objectMember, method);
 
         final String memberName = objectMember.getName();
 
-        if (instanceOf(imperativeFacets, DisableForContextFacetViaMethod.class, HideForContextFacetViaMethod.class)) {
+        final Intent intent = ImperativeFacet.Util.getIntent(objectMember, method);
+        if(intent == Intent.CHECK_IF_HIDDEN || intent == Intent.CHECK_IF_DISABLED) {
             throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'", memberName));
         }
 
         final String methodName = method.getName();
 
-        if (instanceOf(imperativeFacets, ActionDefaultsFacet.class, PropertyDefaultFacet.class, ActionChoicesFacet.class, ActionParameterChoicesFacet.class, PropertyChoicesFacet.class)) {
+        if (intent == Intent.DEFAULTS || intent == Intent.CHOICES_OR_AUTOCOMPLETE) {
             return method.invoke(getDelegate(), args);
         }
 
         if (objectMember.isOneToOneAssociation()) {
 
-            if (instanceOf(imperativeFacets, PropertyValidateFacetViaMethod.class, PropertySetterFacetViaModifyMethod.class, PropertyClearFacetViaClearMethod.class)) {
+            if (intent == Intent.CHECK_IF_VALID || intent == Intent.MODIFY_PROPERTY_SUPPORTING) {
                 throw new UnsupportedOperationException(String.format("Cannot invoke supporting method for '%s'; use only property accessor/mutator", memberName));
             }
 
             final OneToOneAssociation otoa = (OneToOneAssociation) objectMember;
             
-            if (instanceOf(imperativeFacets, PropertyOrCollectionAccessorFacet.class)) {
+            if (intent == Intent.ACCESSOR) {
                 return handleGetterMethodOnProperty(args, targetAdapter, otoa, methodName);
             }
             
-            if (instanceOf(imperativeFacets, PropertySetterFacet.class, PropertyInitializationFacet.class)) {
+            if (intent == Intent.MODIFY_PROPERTY || intent == Intent.INITIALIZATION) {
                 return handleSetterMethodOnProperty(args, getAuthenticationSession(), targetAdapter, otoa, methodName);
             }
         }
         if (objectMember.isOneToManyAssociation()) {
 
-            if (instanceOf(imperativeFacets, CollectionValidateAddToFacetViaMethod.class, CollectionValidateRemoveFromFacetViaMethod.class)) {
+            if (intent == Intent.CHECK_IF_VALID) {
                 throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only collection accessor/mutator", memberName));
             }
 
-
             final OneToManyAssociation otma = (OneToManyAssociation) objectMember;
-            if (instanceOf(imperativeFacets, PropertyOrCollectionAccessorFacet.class)) {
+            if (intent == Intent.ACCESSOR) {
                 return handleGetterMethodOnCollection(method, args, targetAdapter, otma, memberName);
             }
-            if (instanceOf(imperativeFacets, CollectionAddToFacet.class)) {
+            if (intent == Intent.MODIFY_COLLECTION_ADD) {
                 return handleCollectionAddToMethod(args, targetAdapter, otma, methodName);
             }
-            if (instanceOf(imperativeFacets, CollectionRemoveFromFacet.class)) {
+            if (intent == Intent.MODIFY_COLLECTION_REMOVE) {
                 return handleCollectionRemoveFromMethod(args, targetAdapter, otma, methodName);
             }
         }
 
-        // filter out
-        if (instanceOf(imperativeFacets, PropertyOrCollectionAccessorFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke accessor on properties or collections; '%s' represents %s", methodName, decode(objectMember)));
-        }
-        if (instanceOf(imperativeFacets, PropertySetterFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke mutator on properties; '%s' represents %s", methodName, decode(objectMember)));
-        }
-        if (instanceOf(imperativeFacets, CollectionAddToFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke 'adder' on collections; '%s' represents %s", methodName, decode(objectMember)));
-        }
-        if (instanceOf(imperativeFacets, CollectionRemoveFromFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke 'remover' on collections; '%s' represents %s", methodName, decode(objectMember)));
-        }
-
         if (objectMember instanceof ObjectAction) {
 
             // for all members, check visibility and usability
             checkVisibility(getAuthenticationSession(), targetAdapter, objectMember);
 
-
-            if (instanceOf(imperativeFacets, ActionValidationFacetViaMethod.class)) {
+            if (intent == Intent.CHECK_IF_VALID) {
                 throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only the 'invoke' method", memberName));
             }
 
@@ -289,8 +273,9 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
 
     private static boolean instanceOf(final List<?> objects, final Class<?>... superTypes) {
         for (final Class<?> superType : superTypes) {
+            // REVIEW: this is all a bit hacky...
             for (Object obj : objects) {
-                // handle the *WrapTransaction facets etc
+                // handle the *decorators
                 if(obj instanceof DecoratingFacet) {
                     DecoratingFacet<?> decoratingFacet = (DecoratingFacet<?>) obj;
                     obj = ((DecoratingFacet<?>) obj).getDecoratedFacet();
@@ -298,6 +283,14 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
                 if (superType.isAssignableFrom(obj.getClass())) {
                     return true;
                 }
+                if(obj instanceof Facet) {
+                    Facet facet = (Facet) obj;
+                    // handle any wrapping (eg PostPropertyChangedSetterEventFacet)
+                    Facet underlyingFacet = facet.getUnderlyingFacet();
+                    if(underlyingFacet != null && superType.isAssignableFrom(obj.getClass())) {
+                        return true;
+                    }
+                }
             }
         }
         return false;
@@ -662,7 +655,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         return method.equals(saveMethod);
     }
 
-    protected boolean isUnderlyingMethod(final Method method) {
+    protected boolean isWrappedMethod(final Method method) {
         return method.equals(wrappedMethod);
     }