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:01 UTC

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

ISIS-550: refactored DomainObjectInvocationHandler and ImperativeFacets

Previously DOIH (that the WrapperFactory's wrapper proxies delegates to) was hard-coded to search for particular ImperativeFacets and act accordingly.
This has now been abstracted out into the concept of an Intent (enum defined in ImperativeFacet) which allows more precise control as to how to interpret any given method that is invoked through the wrapper .

In addition:
- split PostPropertyChangedEventFacet into two: PostsPropertyChangedEventSetterFacet and PostsPropertyChangedEventClearFacet, so that both can wrap an underlying *FacetViaMethod.
  This pattern is then consistent with the PostsCollectionFacets (though not the PostsActionInvokedEventFacet)
- (related to ISIS-769), have moved the setup of request-scoped services from the PersistenceSession#open and into IsisTransactionManager#startTransaction.  This is for symmetry with the #endTransaction.


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

Branch: refs/heads/master
Commit: 5f15fa74cb61ddd21040b9033af74e84cc838214
Parents: 6ba1b7c
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun May 11 18:41:24 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 11 18:41:24 2014 +0100

----------------------------------------------------------------------
 .../ObjectResolveAndObjectChangedEnhancer.java  |   2 +-
 .../tck/ObjectStoreContractTest_persist.java    |   9 ++
 .../integtestsupport/legacy/AbstractTest.java   |  16 +-
 .../legacy/ObjectImmutableTest.java             |  10 +-
 .../core/metamodel/facets/ImperativeFacet.java  |  72 ++++++++-
 .../metamodel/facets/ImperativeFacetUtils.java  |   2 +-
 .../PostsPropertyChangedEventClearFacet.java    |  48 ++++++
 ...sPropertyChangedEventClearFacetAbstract.java |  43 +++++
 .../event/PostsPropertyChangedEventFacet.java   |  73 ---------
 .../PostsPropertyChangedEventFacetAbstract.java |  47 ------
 .../PostsPropertyChangedEventSetterFacet.java   |  47 ++++++
 ...PropertyChangedEventSetterFacetAbstract.java |  43 +++++
 .../facets/properties/event/Utils.java          |  59 +++++++
 .../dflt/ObjectSpecificationDefault.java        |  18 ++-
 .../method/ActionDefaultsFacetViaMethod.java    |   6 +
 .../invoke/ActionInvocationFacetViaMethod.java  |   6 +
 .../method/ActionValidationFacetViaMethod.java  |   5 +
 .../CollectionAccessorFacetViaAccessor.java     |   6 +
 .../clear/CollectionClearFacetViaAccessor.java  |   6 +
 .../clear/CollectionClearFacetViaMethod.java    |   6 +
 .../modify/CollectionAddToFacetViaAccessor.java |   5 +
 .../modify/CollectionAddToFacetViaMethod.java   |   5 +
 .../CollectionRemoveFromFacetViaAccessor.java   |   6 +
 .../CollectionRemoveFromFacetViaMethod.java     |   6 +
 .../CollectionValidateAddToFacetViaMethod.java  |   6 +
 ...lectionValidateRemoveFromFacetViaMethod.java |   6 +
 .../staticmethod/DescribedAsFacetViaMethod.java |   6 +
 .../DisableForSessionFacetViaMethod.java        |   6 +
 .../method/DisableForContextFacetViaMethod.java |   6 +
 .../HideForSessionFacetViaMethod.java           |   6 +
 .../method/HideForContextFacetViaMethod.java    |   6 +
 .../named/staticmethod/NamedFacetViaMethod.java |   6 +
 .../create/CreatedCallbackFacetViaMethod.java   |   6 +
 .../load/LoadedCallbackFacetViaMethod.java      |   5 +
 .../load/LoadingCallbackFacetViaMethod.java     |   6 +
 .../PersistedCallbackFacetViaMethod.java        |   6 +
 .../PersistingCallbackFacetViaMethod.java       |   6 +
 .../remove/RemovedCallbackFacetViaMethod.java   |   6 +
 .../remove/RemovingCallbackFacetViaMethod.java  |   6 +
 .../update/UpdatedCallbackFacetViaMethod.java   |   6 +
 .../update/UpdatingCallbackFacetViaMethod.java  |   6 +
 .../method/ClearDirtyObjectFacetViaMethod.java  |   6 +
 .../method/IsDirtyObjectFacetViaMethod.java     |   6 +
 .../method/MarkDirtyObjectFacetViaMethod.java   |   6 +
 .../DisabledObjectFacetViaDisabledMethod.java   |   6 +
 .../object/title/TitleFacetViaTitleMethod.java  |   6 +
 .../title/TitleFacetViaToStringMethod.java      |   6 +
 .../ValidateObjectFacetViaValidateMethod.java   |   6 +
 ...tionParameterAutoCompleteFacetViaMethod.java |   6 +
 .../method/ActionChoicesFacetViaMethod.java     |   5 +
 .../ActionParameterChoicesFacetViaMethod.java   |   6 +
 .../ActionParameterDefaultsFacetViaMethod.java  |   6 +
 .../PropertyAccessorFacetViaAccessor.java       |   6 +
 .../PropertyAutoCompleteFacetViaMethod.java     |   6 +
 .../method/PropertyChoicesFacetViaMethod.java   |   6 +
 .../method/PropertyDefaultFacetViaMethod.java   |   6 +
 .../facets/properties/event/Helper.java         |  48 ++++++
 ...pertyChangedEventAnnotationFacetFactory.java |  38 ++---
 ...ropertyChangedEventClearFacetAnnotation.java | 118 ++++++++++++++
 ...ostsPropertyChangedEventFacetAnnotation.java | 157 -------------------
 ...opertyChangedEventSetterFacetAnnotation.java | 117 ++++++++++++++
 .../PropertyClearFacetViaClearMethod.java       |   6 +
 .../PropertyClearFacetViaSetterMethod.java      |   6 +
 ...pertyInitializationFacetViaSetterMethod.java |   7 +
 .../PropertySetterFacetViaModifyMethod.java     |   6 +
 .../PropertySetterFacetViaSetterMethod.java     |   6 +
 .../PropertyValidateFacetViaMethod.java         |   6 +
 .../facets/ImperativeFacetUtilsTest.java        |   4 +-
 ...ertyChangedEventFacet_UtilTest_newEvent.java |   6 +-
 .../eventbus/EventBusServiceDefault.java        |   3 +-
 .../system/persistence/PersistenceSession.java  |  77 ---------
 .../transaction/IsisTransactionManager.java     | 108 ++++++++++++-
 ...reTransactionManager_EndTransactionTest.java |   8 +-
 .../handlers/DomainObjectInvocationHandler.java |  57 +++----
 ...rapperFactoryAbstractTest_wrappedObject.java |   5 +-
 ...oryAbstractTest_wrappedObject_transient.java |   8 +-
 76 files changed, 1070 insertions(+), 457 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/bytecode-cglib/src/main/java/org/apache/isis/core/bytecode/cglib/ObjectResolveAndObjectChangedEnhancer.java
----------------------------------------------------------------------
diff --git a/core/bytecode-cglib/src/main/java/org/apache/isis/core/bytecode/cglib/ObjectResolveAndObjectChangedEnhancer.java b/core/bytecode-cglib/src/main/java/org/apache/isis/core/bytecode/cglib/ObjectResolveAndObjectChangedEnhancer.java
index d5c68a7..a4ee0a6 100644
--- a/core/bytecode-cglib/src/main/java/org/apache/isis/core/bytecode/cglib/ObjectResolveAndObjectChangedEnhancer.java
+++ b/core/bytecode-cglib/src/main/java/org/apache/isis/core/bytecode/cglib/ObjectResolveAndObjectChangedEnhancer.java
@@ -68,7 +68,7 @@ public class ObjectResolveAndObjectChangedEnhancer extends ObjectResolveAndObjec
                     final ObjectSpecificationDefault targetObjSpec = getJavaSpecificationOfOwningClass(proxiedMethod);
                     final ObjectMember member = targetObjSpec.getMember(proxiedMethod);
 
-                    flags = ImperativeFacetUtils.getImperativeFacetFlags(member, proxiedMethod);
+                    flags = ImperativeFacet.Util.getFlags(member, proxiedMethod);
 
                     if (flags.impliesResolve()) {
                         objectResolver.resolve(proxied, member.getName());

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/tck/ObjectStoreContractTest_persist.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/tck/ObjectStoreContractTest_persist.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/tck/ObjectStoreContractTest_persist.java
index 37606b2..a158b20 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/tck/ObjectStoreContractTest_persist.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/tck/ObjectStoreContractTest_persist.java
@@ -153,19 +153,28 @@ public abstract class ObjectStoreContractTest_persist {
     public void removeInstance() throws Exception {
 
         // given persisted
+        iswf.beginTran();
         resetPersistenceStore();
         ObjectAdapter adapter = iswf.persist(iswf.fixtures.smpl2);
         final RootOid oid = (RootOid) adapter.getOid();
+        iswf.commitTran();
+        
         iswf.bounceSystem();
 
         // when destroy
+        iswf.beginTran();
         adapter = iswf.reload(oid);
         
         SimpleEntity epv = (SimpleEntity) adapter.getObject();
         iswf.destroy(epv);
+        iswf.commitTran();
+
         iswf.bounceSystem();
 
         // then not found
+        iswf.beginTran();
         assertEquals(false, getStore().hasInstances(epvSpecification));
+        iswf.commitTran();
     }
 }
+

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/AbstractTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/AbstractTest.java b/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/AbstractTest.java
index 7f23be5..0406bdb 100644
--- a/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/AbstractTest.java
+++ b/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/AbstractTest.java
@@ -19,12 +19,16 @@
 
 package org.apache.isis.core.integtestsupport.legacy;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.runner.RunWith;
 
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.applib.services.wrapper.WrapperObject;
 import org.apache.isis.core.integtestsupport.legacy.sample.domain.Country;
 import org.apache.isis.core.integtestsupport.legacy.sample.domain.Customer;
 import org.apache.isis.core.integtestsupport.legacy.sample.domain.Product;
@@ -47,12 +51,12 @@ public abstract class AbstractTest {
     protected Customer custJsWO;
 
     protected Product product355DO;
-    protected Product product355VO;
+    protected Product product355WO;
 
     protected Product product850DO;
 
     protected Country countryGbrDO;
-    protected Country countryGbrVO;
+    protected Country countryGbrWO;
 
     protected Country countryUsaDO;
     protected Country countryAusDO;
@@ -68,17 +72,21 @@ public abstract class AbstractTest {
     public void setUp() {
 
         product355DO = productRepository.findByCode("355-40311");
-        product355VO = wrapperFactory.wrap(product355DO);
+        product355WO = wrapperFactory.wrap(product355DO);
         product850DO = productRepository.findByCode("850-18003");
 
         countryGbrDO = countryRepository.findByCode("GBR");
-        countryGbrVO = wrapperFactory.wrap(countryGbrDO);
+        countryGbrWO = wrapperFactory.wrap(countryGbrDO);
 
         countryUsaDO = countryRepository.findByCode("USA");
         countryAusDO = countryRepository.findByCode("AUS");
 
         custJsDO = customerRepository.findByName("Pawson");
         custJsWO = wrapperFactory.wrap(custJsDO);
+        
+        assertThat(product355WO instanceof WrapperObject, is(true));
+        assertThat(countryGbrWO instanceof WrapperObject, is(true));
+        assertThat(custJsWO instanceof WrapperObject, is(true));
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/ObjectImmutableTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/ObjectImmutableTest.java b/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/ObjectImmutableTest.java
index 8addec2..e4ceb1d 100644
--- a/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/ObjectImmutableTest.java
+++ b/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/ObjectImmutableTest.java
@@ -35,7 +35,7 @@ public class ObjectImmutableTest extends AbstractTest {
     @Test
     public void settingValueOnImmutableObjectThrowsException() {
         try {
-            product355VO.setDescription("Changed");
+            product355WO.setDescription("Changed");
             fail("Should have thrown exception");
         } catch (final DisabledException ex) {
             assertThat(ex.getAdvisorClass(), classEqualTo(DisabledFacetForPropertyDerivedFromImmutable.class));
@@ -46,7 +46,7 @@ public class ObjectImmutableTest extends AbstractTest {
     @Test
     public void settingAssociationOnImmutableObjectThrowsException() {
         try {
-            product355VO.setPlaceOfManufacture(countryUsaDO);
+            product355WO.setPlaceOfManufacture(countryUsaDO);
             fail("Should have thrown exception");
         } catch (final DisabledException ex) {
             assertThat(ex.getAdvisorClass(), classEqualTo(DisabledFacetForPropertyDerivedFromImmutable.class));
@@ -57,7 +57,7 @@ public class ObjectImmutableTest extends AbstractTest {
     @Test
     public void addingToCollectionOnImmutableObjectThrowsException() {
         try {
-            product355VO.addToSimilarProducts(product850DO);
+            product355WO.addToSimilarProducts(product850DO);
             fail("Should have thrown exception");
         } catch (final DisabledException ex) {
             assertThat(ex.getAdvisorClass(), classEqualTo(DisabledFacetForCollectionDerivedFromImmutable.class));
@@ -71,7 +71,7 @@ public class ObjectImmutableTest extends AbstractTest {
                                                          // throws
         // ObjectPersistenceException
         try {
-            product355VO.removeFromSimilarProducts(product850DO);
+            product355WO.removeFromSimilarProducts(product850DO);
             fail("Should have thrown exception");
         } catch (final DisabledException ex) {
             assertThat(ex.getAdvisorClass(), classEqualTo(DisabledFacetForCollectionDerivedFromImmutable.class));
@@ -81,7 +81,7 @@ public class ObjectImmutableTest extends AbstractTest {
 
     @Test
     public void canInvokingOnImmutableObject() {
-        product355VO.foobar();
+        product355WO.foobar();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
index f702496..c56930f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
@@ -22,9 +22,12 @@ package org.apache.isis.core.metamodel.facets;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 import org.apache.isis.core.metamodel.facetapi.DecoratingFacet;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -71,6 +74,33 @@ public interface ImperativeFacet {
      */
     public List<Method> getMethods();
 
+    public static enum Intent {
+        CHECK_IF_HIDDEN,
+        CHECK_IF_DISABLED,
+        CHECK_IF_VALID,
+        ACCESSOR,
+        EXECUTE,
+        MODIFY_PROPERTY,
+        /**
+         * Modify property using modify/clear rather than simply using set.
+         */
+        MODIFY_PROPERTY_SUPPORTING, 
+        MODIFY_COLLECTION_ADD,
+        MODIFY_COLLECTION_REMOVE,
+        CHOICES_OR_AUTOCOMPLETE,
+        DEFAULTS, 
+        INITIALIZATION,
+        LIFECYCLE, 
+        UI_HINT
+    }
+    
+    /**
+     * The intent of this method, so that the {@link WrapperFactory} knows whether to delegate on or to reject.
+     * @param method - one of the methods returned from {@link #getMethods()}
+     */
+    public Intent getIntent(Method method);
+
+
     /**
      * For use by
      * {@link FacetHolder#getFacets(org.apache.isis.core.metamodel.facetapi.progmodel.facets.org.apache.isis.nof.arch.facets.Facet.Filter)}
@@ -78,7 +108,7 @@ public interface ImperativeFacet {
     public static Filter<Facet> FILTER = new Filter<Facet>() {
         @Override
         public boolean accept(final Facet facet) {
-            return ImperativeFacetUtils.isImperativeFacet(facet);
+            return ImperativeFacet.Util.isImperativeFacet(facet);
         }
     };
 
@@ -128,14 +158,14 @@ public interface ImperativeFacet {
             return getImperativeFacet(facet) != null;
         }
 
-        public static Flags getImperativeFacetFlags(final ObjectMember member, final Method method) {
+        public static Flags getFlags(final ObjectMember member, final Method method) {
             final Flags flags = new Flags();
             if (member == null) {
                 return flags;
             }
             final List<Facet> allFacets = member.getFacets(Filters.anyOfType(Facet.class));
             for (final Facet facet : allFacets) {
-                final ImperativeFacet imperativeFacet = ImperativeFacetUtils.getImperativeFacet(facet);
+                final ImperativeFacet imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
                 if (imperativeFacet == null) {
                     continue;
                 }
@@ -152,6 +182,40 @@ public interface ImperativeFacet {
             }
             return flags;
         }
+        
+        public static Intent getIntent(final ObjectMember member, final Method method) {
+            final List<Facet> allFacets = member.getFacets(Filters.anyOfType(Facet.class));
+            final List<ImperativeFacet> imperativeFacets = Lists.newArrayList();
+            for (final Facet facet : allFacets) {
+                final ImperativeFacet imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
+                if (imperativeFacet == null) {
+                    continue;
+                }
+                final List<Method> methods = imperativeFacet.getMethods();
+                if (!methods.contains(method)) {
+                    continue;
+                }
+                imperativeFacets.add(imperativeFacet);
+            }
+            switch(imperativeFacets.size()) {
+                case 0:
+                    break;
+                case 1:
+                    return imperativeFacets.get(0).getIntent(method);
+                default:
+                    Intent intentToReturn = null;
+                    for (ImperativeFacet imperativeFacet : imperativeFacets) {
+                        Intent intent = imperativeFacet.getIntent(method);
+                        if(intentToReturn == null) {
+                            intentToReturn = intent;
+                        } else if(intentToReturn != intent) {
+                            throw new IllegalArgumentException(member.getIdentifier().toClassAndNameIdentityString() +  ": more than one ImperativeFacet for method " + method.getName() + " , with inconsistent intents: " + imperativeFacets.toString());
+                        }
+                    }
+                    return intentToReturn;
+            }
+            throw new IllegalArgumentException(member.getIdentifier().toClassAndNameIdentityString() +  ": unable to determine intent of " + method.getName());
+        }
     }
 
     public static class Flags {
@@ -176,6 +240,4 @@ public interface ImperativeFacet {
         }
     }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtils.java
index 049ba3e..5fd8463 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetUtils.java
@@ -52,7 +52,7 @@ public final class ImperativeFacetUtils {
      */
     @Deprecated
     public static ImperativeFacet.Flags getImperativeFacetFlags(final ObjectMember member, final Method method) {
-        return ImperativeFacet.Util.getImperativeFacetFlags(member, method);
+        return ImperativeFacet.Util.getFlags(member, method);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacet.java
new file mode 100644
index 0000000..e9a0b31
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacet.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.metamodel.facets.properties.event;
+
+import java.lang.reflect.InvocationTargetException;
+
+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.facets.SingleValueFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
+
+/**
+ * Indicates that (the specified subclass of) {@link PropertyChangedEvent} should be posted to the
+ * {@link EventBusService}.
+ */
+public interface PostsPropertyChangedEventClearFacet 
+        extends SingleValueFacet<Class<? extends PropertyChangedEvent<?,?>>>, PropertyClearFacet {
+
+    public static class Util {
+        private Util(){}
+        public static <S,T> PropertyChangedEvent<S,T> newEvent(
+                final Class<? extends PropertyChangedEvent<S, T>> type, 
+                final S source, 
+                final Identifier identifier,
+                final T oldValue, 
+                final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
+            return org.apache.isis.core.metamodel.facets.properties.event.Utils.newEvent(type, source, identifier, oldValue, newValue);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacetAbstract.java
new file mode 100644
index 0000000..786b573
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventClearFacetAbstract.java
@@ -0,0 +1,43 @@
+/*
+ *  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.metamodel.facets.properties.event;
+
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
+
+public abstract class PostsPropertyChangedEventClearFacetAbstract 
+        extends SingleValueFacetAbstract<Class<? extends PropertyChangedEvent<?,?>>> 
+        implements PostsPropertyChangedEventClearFacet, MultiTypedFacet {
+
+    public static Class<? extends Facet> type() {
+        return PropertyClearFacet.class;
+    }
+
+    public PostsPropertyChangedEventClearFacetAbstract(
+            final Class<? extends PropertyChangedEvent<?,?>> changedEventType, 
+            final FacetHolder holder) {
+        super(type(), changedEventType, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
deleted file mode 100644
index a7d3fd5..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
+++ /dev/null
@@ -1,73 +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.metamodel.facets.properties.event;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
-import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
-import org.apache.isis.core.metamodel.facets.SingleValueFacet;
-import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
-import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
-
-/**
- * Indicates that (the specified subclass of) {@link PropertyChangedEvent} should be posted to the
- * {@link EventBusService}.
- */
-public interface PostsPropertyChangedEventFacet extends SingleValueFacet<Class<? extends PropertyChangedEvent<?,?>>>, PropertyClearFacet, PropertySetterFacet, MultiTypedFacet {
-
-    public static class Util {
-        private Util(){}
-        @SuppressWarnings("unchecked")
-        public static <S,T> PropertyChangedEvent<S,T> newEvent(
-                final Class<? extends PropertyChangedEvent<S, T>> type, 
-                final S source, 
-                final Identifier identifier,
-                final T oldValue, 
-                final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
-            final Constructor<?>[] constructors = type.getConstructors();
-            for (final Constructor<?> constructor : constructors) {
-                final Class<?>[] parameterTypes = constructor.getParameterTypes();
-                if(parameterTypes.length != 4) {
-                    continue;
-                }
-                if(!parameterTypes[0].isAssignableFrom(source.getClass())) {
-                    continue;
-                }
-                if(!parameterTypes[1].isAssignableFrom(Identifier.class)) {
-                    continue;
-                }
-                if(oldValue != null && !parameterTypes[2].isAssignableFrom(oldValue.getClass())) {
-                    continue;
-                }
-                if(newValue != null && !parameterTypes[3].isAssignableFrom(newValue.getClass())) {
-                    continue;
-                }
-                final Object event = constructor.newInstance(source, identifier, oldValue, newValue);
-                return (PropertyChangedEvent<S, T>) event;
-            }
-            throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object, java.lang.Object)");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
deleted file mode 100644
index 968d4ae..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
+++ /dev/null
@@ -1,47 +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.metamodel.facets.properties.event;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-
-public abstract class PostsPropertyChangedEventFacetAbstract 
-        extends SingleValueFacetAbstract<Class<? extends PropertyChangedEvent<?,?>>> 
-        implements PostsPropertyChangedEventFacet {
-
-    public static Class<? extends Facet> type() {
-        // different implementation to PostsCollectionAddToEventFacet (for example) because this facet wraps
-        // multiple facets and so we cannot use the setUnderlyingFacet capability.
-        return PostsPropertyChangedEventFacet.class;
-    }
-
-    public PostsPropertyChangedEventFacetAbstract(
-            final Class<? extends PropertyChangedEvent<?,?>> changedEventType, 
-            final FacetHolder holder) {
-        super(type(), changedEventType, holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacet.java
new file mode 100644
index 0000000..c40581a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacet.java
@@ -0,0 +1,47 @@
+/*
+ *  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.metamodel.facets.properties.event;
+
+import java.lang.reflect.InvocationTargetException;
+
+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.facets.SingleValueFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
+
+/**
+ * Indicates that (the specified subclass of) {@link PropertyChangedEvent} should be posted to the
+ * {@link EventBusService}.
+ */
+public interface PostsPropertyChangedEventSetterFacet extends SingleValueFacet<Class<? extends PropertyChangedEvent<?,?>>>, PropertySetterFacet {
+
+    public static class Util {
+        private Util(){}
+        public static <S,T> PropertyChangedEvent<S,T> newEvent(
+                final Class<? extends PropertyChangedEvent<S, T>> type, 
+                final S source, 
+                final Identifier identifier,
+                final T oldValue, 
+                final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
+            return org.apache.isis.core.metamodel.facets.properties.event.Utils.newEvent(type, source, identifier, oldValue, newValue);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAbstract.java
new file mode 100644
index 0000000..b8afca3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventSetterFacetAbstract.java
@@ -0,0 +1,43 @@
+/*
+ *  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.metamodel.facets.properties.event;
+
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
+
+public abstract class PostsPropertyChangedEventSetterFacetAbstract 
+        extends SingleValueFacetAbstract<Class<? extends PropertyChangedEvent<?,?>>> 
+        implements PostsPropertyChangedEventSetterFacet, MultiTypedFacet {
+
+    public static Class<? extends Facet> type() {
+        return PropertySetterFacet.class;
+    }
+
+    public PostsPropertyChangedEventSetterFacetAbstract(
+            final Class<? extends PropertyChangedEvent<?,?>> changedEventType, 
+            final FacetHolder holder) {
+        super(type(), changedEventType, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/Utils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/Utils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/Utils.java
new file mode 100644
index 0000000..b29420f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/Utils.java
@@ -0,0 +1,59 @@
+/*
+ *  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.metamodel.facets.properties.event;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
+
+class Utils {
+    private Utils(){}
+    @SuppressWarnings("unchecked")
+    public static <S,T> PropertyChangedEvent<S,T> newEvent(
+            final Class<? extends PropertyChangedEvent<S, T>> type, 
+            final S source, 
+            final Identifier identifier,
+            final T oldValue, 
+            final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
+        final Constructor<?>[] constructors = type.getConstructors();
+        for (final Constructor<?> constructor : constructors) {
+            final Class<?>[] parameterTypes = constructor.getParameterTypes();
+            if(parameterTypes.length != 4) {
+                continue;
+            }
+            if(!parameterTypes[0].isAssignableFrom(source.getClass())) {
+                continue;
+            }
+            if(!parameterTypes[1].isAssignableFrom(Identifier.class)) {
+                continue;
+            }
+            if(oldValue != null && !parameterTypes[2].isAssignableFrom(oldValue.getClass())) {
+                continue;
+            }
+            if(newValue != null && !parameterTypes[3].isAssignableFrom(newValue.getClass())) {
+                continue;
+            }
+            final Object event = constructor.newInstance(source, identifier, oldValue, newValue);
+            return (PropertyChangedEvent<S, T>) event;
+        }
+        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object, java.lang.Object)");
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 72fb21c..dd2073d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -97,7 +97,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
      * Lazily built by {@link #getMember(Method)}.
      */
     private Map<Method, ObjectMember> membersByMethod = null;
-
+    
     private final IntrospectionContext introspectionContext;
     private final CreateObjectContext createObjectContext;
 
@@ -425,14 +425,18 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     public ObjectMember getMember(final Method method) {
         if (membersByMethod == null) {
-            final HashMap<Method, ObjectMember> membersByMethod = Maps.newHashMap();
-            cataloguePropertiesAndCollections(membersByMethod);
-            catalogueActions(membersByMethod);
-            this.membersByMethod = membersByMethod;
+            this.membersByMethod = catalogueMembers();
         }
         return membersByMethod.get(method);
     }
 
+    private HashMap<Method, ObjectMember> catalogueMembers() {
+        final HashMap<Method, ObjectMember> membersByMethod = Maps.newHashMap();
+        cataloguePropertiesAndCollections(membersByMethod);
+        catalogueActions(membersByMethod);
+        return membersByMethod;
+    }
+    
     private void cataloguePropertiesAndCollections(final Map<Method, ObjectMember> membersByMethod) {
         final Filter<ObjectAssociation> noop = Filters.anyOfType(ObjectAssociation.class);
         final List<ObjectAssociation> fields = getAssociations(Contributed.EXCLUDED, noop);
@@ -440,7 +444,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
             final ObjectAssociation field = fields.get(i);
             final List<Facet> facets = field.getFacets(ImperativeFacet.FILTER);
             for (final Facet facet : facets) {
-                final ImperativeFacet imperativeFacet = ImperativeFacetUtils.getImperativeFacet(facet);
+                final ImperativeFacet imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
                 for (final Method imperativeFacetMethod : imperativeFacet.getMethods()) {
                     membersByMethod.put(imperativeFacetMethod, field);
                 }
@@ -454,7 +458,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
             final ObjectAction userAction = userActions.get(i);
             final List<Facet> facets = userAction.getFacets(ImperativeFacet.FILTER);
             for (final Facet facet : facets) {
-                final ImperativeFacet imperativeFacet = ImperativeFacetUtils.getImperativeFacet(facet);
+                final ImperativeFacet imperativeFacet = ImperativeFacet.Util.getImperativeFacet(facet);
                 for (final Method imperativeFacetMethod : imperativeFacet.getMethods()) {
                     membersByMethod.put(imperativeFacetMethod, userAction);
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
index d73e76c..7753529 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 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.actions.defaults.ActionDefaultsFacetAbstract;
 import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
 import org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod;
@@ -67,6 +68,11 @@ public class ActionDefaultsFacetViaMethod extends ActionDefaultsFacetAbstract im
     }
 
     @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/actions/invoke/ActionInvocationFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
index e9956d1..42ae7d5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
@@ -47,6 +47,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 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.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacetAbstract;
@@ -100,6 +101,11 @@ public class ActionInvocationFacetViaMethod extends ActionInvocationFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.EXECUTE;
+    }
+
+    @Override
     public ObjectSpecification getReturnType() {
         return returnType;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
index 4c63bc1..f4769a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
@@ -48,6 +48,11 @@ public class ActionValidationFacetViaMethod extends ActionValidationFacetAbstrac
     }
 
     @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/collections/accessor/CollectionAccessorFacetViaAccessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
index e0d9c2d..3417e35 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.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 CollectionAccessorFacetViaAccessor extends PropertyOrCollectionAccessorFacetAbstract implements ImperativeFacet {
@@ -49,6 +50,11 @@ public class CollectionAccessorFacetViaAccessor extends PropertyOrCollectionAcce
     }
 
     @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/collections/clear/CollectionClearFacetViaAccessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
index 7f4fd80..79633c4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaAccessor.java
@@ -31,6 +31,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.facets.collections.modify.CollectionClearFacetAbstract;
 
 public class CollectionClearFacetViaAccessor extends CollectionClearFacetAbstract implements ImperativeFacet {
@@ -56,6 +57,11 @@ public class CollectionClearFacetViaAccessor extends CollectionClearFacetAbstrac
     }
 
     @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/collections/clear/CollectionClearFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaMethod.java
index 9bb2e5a..c9deb4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/clear/CollectionClearFacetViaMethod.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.collections.modify.CollectionClearFacetAbstract;
 
 public class CollectionClearFacetViaMethod extends CollectionClearFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class CollectionClearFacetViaMethod extends CollectionClearFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_COLLECTION_ADD;
+    }
+
+    @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/collections/modify/CollectionAddToFacetViaAccessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
index ddfab1e..0334828 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaAccessor.java
@@ -54,6 +54,11 @@ public class CollectionAddToFacetViaAccessor extends CollectionAddToFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_COLLECTION_ADD;
+    }
+
+    @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/collections/modify/CollectionAddToFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaMethod.java
index 3a04676..7778c81 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionAddToFacetViaMethod.java
@@ -48,6 +48,11 @@ public class CollectionAddToFacetViaMethod extends CollectionAddToFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_COLLECTION_ADD;
+    }
+
+    @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/collections/modify/CollectionRemoveFromFacetViaAccessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
index 612d4aa..1c36aa6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaAccessor.java
@@ -31,6 +31,7 @@ import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
 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.collections.modify.CollectionRemoveFromFacetAbstract;
 
 public class CollectionRemoveFromFacetViaAccessor extends CollectionRemoveFromFacetAbstract implements ImperativeFacet {
@@ -54,6 +55,11 @@ public class CollectionRemoveFromFacetViaAccessor extends CollectionRemoveFromFa
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_COLLECTION_REMOVE;
+    }
+
+    @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/collections/modify/CollectionRemoveFromFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.java
index 9fbda42..4fb7641 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/modify/CollectionRemoveFromFacetViaMethod.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.collections.modify.CollectionRemoveFromFacetAbstract;
 
 public class CollectionRemoveFromFacetViaMethod extends CollectionRemoveFromFacetAbstract implements ImperativeFacet {
@@ -48,6 +49,11 @@ public class CollectionRemoveFromFacetViaMethod extends CollectionRemoveFromFace
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.MODIFY_COLLECTION_REMOVE;
+    }
+
+    @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/collections/validate/CollectionValidateAddToFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.java
index f4d0cca..6d24b89 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateAddToFacetViaMethod.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 CollectionValidateAddToFacetViaMethod extends CollectionValidateAddToFacetAbstract implements ImperativeFacet {
 
@@ -47,6 +48,11 @@ public class CollectionValidateAddToFacetViaMethod extends CollectionValidateAdd
     }
 
     @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/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java
index 7a4a213..f5424d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/validate/CollectionValidateRemoveFromFacetViaMethod.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 CollectionValidateRemoveFromFacetViaMethod extends CollectionValidateRemoveFromFacetAbstract implements ImperativeFacet {
 
@@ -47,6 +48,11 @@ public class CollectionValidateRemoveFromFacetViaMethod extends CollectionValida
     }
 
     @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/members/describedas/staticmethod/DescribedAsFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/describedas/staticmethod/DescribedAsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/describedas/staticmethod/DescribedAsFacetViaMethod.java
index 672b56d..59fb27f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/describedas/staticmethod/DescribedAsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/describedas/staticmethod/DescribedAsFacetViaMethod.java
@@ -25,6 +25,7 @@ import java.util.List;
 
 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.describedas.DescribedAsFacetAbstract;
 
 public class DescribedAsFacetViaMethod extends DescribedAsFacetAbstract implements ImperativeFacet {
@@ -42,6 +43,11 @@ public class DescribedAsFacetViaMethod extends DescribedAsFacetAbstract implemen
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.UI_HINT;
+    }
+
+    @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/members/disabled/forsession/DisableForSessionFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java
index 19723e6..3262b62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethod.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSessionUtils;
 import org.apache.isis.core.commons.lang.MethodExtensions;
 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.members.disabled.DisableForSessionFacetAbstract;
 
 public class DisableForSessionFacetViaMethod extends DisableForSessionFacetAbstract implements ImperativeFacet {
@@ -49,6 +50,11 @@ public class DisableForSessionFacetViaMethod extends DisableForSessionFacetAbstr
     }
 
     @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/members/disabled/method/DisableForContextFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
index 0282b7c..a16700b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/method/DisableForContextFacetViaMethod.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.interactions.UsabilityContext;
 import org.apache.isis.core.progmodel.facets.members.disabled.DisableForContextFacetAbstract;
 
@@ -50,6 +51,11 @@ public class DisableForContextFacetViaMethod extends DisableForContextFacetAbstr
     }
 
     @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/members/hidden/forsession/HideForSessionFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java
index c558504..9b49f86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/forsession/HideForSessionFacetViaMethod.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSessionUtils;
 import org.apache.isis.core.commons.lang.MethodExtensions;
 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.members.hidden.HideForSessionFacetAbstract;
 
 public class HideForSessionFacetViaMethod extends HideForSessionFacetAbstract implements ImperativeFacet {
@@ -49,6 +50,11 @@ public class HideForSessionFacetViaMethod extends HideForSessionFacetAbstract im
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHECK_IF_HIDDEN;
+    }
+
+    @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/members/hidden/method/HideForContextFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/method/HideForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
index 40e3bc4..8e3af31 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/method/HideForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/method/HideForContextFacetViaMethod.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.interactions.VisibilityContext;
 import org.apache.isis.core.progmodel.facets.members.hidden.HideForContextFacetAbstract;
 
@@ -50,6 +51,11 @@ public class HideForContextFacetViaMethod extends HideForContextFacetAbstract im
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHECK_IF_HIDDEN;
+    }
+
+    @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/members/named/staticmethod/NamedFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/named/staticmethod/NamedFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/named/staticmethod/NamedFacetViaMethod.java
index 8739251..b3d6f3b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/named/staticmethod/NamedFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/named/staticmethod/NamedFacetViaMethod.java
@@ -25,6 +25,7 @@ import java.util.List;
 
 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.named.NamedFacetAbstract;
 
 public class NamedFacetViaMethod extends NamedFacetAbstract implements ImperativeFacet {
@@ -46,6 +47,11 @@ public class NamedFacetViaMethod extends NamedFacetAbstract implements Imperativ
     }
 
     @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/callbacks/create/CreatedCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/create/CreatedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/create/CreatedCallbackFacetViaMethod.java
index d0bee2a..01e9014 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/create/CreatedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/create/CreatedCallbackFacetViaMethod.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;
 
 public class CreatedCallbackFacetViaMethod extends CreatedCallbackFacetAbstract implements ImperativeFacet {
 
@@ -44,6 +45,11 @@ public class CreatedCallbackFacetViaMethod extends CreatedCallbackFacetAbstract
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public List<Method> getMethods() {
         return Collections.unmodifiableList(methods);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadedCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadedCallbackFacetViaMethod.java
index 918ad4d..2c8cf86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadedCallbackFacetViaMethod.java
@@ -49,6 +49,11 @@ public class LoadedCallbackFacetViaMethod extends LoadedCallbackFacetAbstract im
     }
 
     @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/callbacks/load/LoadingCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadingCallbackFacetViaMethod.java
index 1619f20..5a97e2b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/load/LoadingCallbackFacetViaMethod.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;
 
 public class LoadingCallbackFacetViaMethod extends LoadingCallbackFacetAbstract implements ImperativeFacet {
 
@@ -49,6 +50,11 @@ public class LoadingCallbackFacetViaMethod extends LoadingCallbackFacetAbstract
     }
 
     @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/callbacks/persist/PersistedCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistedCallbackFacetViaMethod.java
index 0582cf1..9c9f27b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistedCallbackFacetViaMethod.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;
 
 public class PersistedCallbackFacetViaMethod extends PersistedCallbackFacetAbstract implements ImperativeFacet {
 
@@ -44,6 +45,11 @@ public class PersistedCallbackFacetViaMethod extends PersistedCallbackFacetAbstr
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public List<Method> getMethods() {
         return Collections.unmodifiableList(methods);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f15fa74/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistingCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistingCallbackFacetViaMethod.java
index 6e60d2d..ab125f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/persist/PersistingCallbackFacetViaMethod.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;
 
 public class PersistingCallbackFacetViaMethod extends PersistingCallbackFacetAbstract implements ImperativeFacet {
 
@@ -49,6 +50,11 @@ public class PersistingCallbackFacetViaMethod extends PersistingCallbackFacetAbs
     }
 
     @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/callbacks/remove/RemovedCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovedCallbackFacetViaMethod.java
index 3afa9f7..e81a0a6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovedCallbackFacetViaMethod.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;
 
 public class RemovedCallbackFacetViaMethod extends RemovedCallbackFacetAbstract implements ImperativeFacet {
 
@@ -49,6 +50,11 @@ public class RemovedCallbackFacetViaMethod extends RemovedCallbackFacetAbstract
     }
 
     @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/callbacks/remove/RemovingCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovingCallbackFacetViaMethod.java
index 9d04a2e..c0670ab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/remove/RemovingCallbackFacetViaMethod.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;
 
 public class RemovingCallbackFacetViaMethod extends RemovingCallbackFacetAbstract implements ImperativeFacet {
 
@@ -49,6 +50,11 @@ public class RemovingCallbackFacetViaMethod extends RemovingCallbackFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public boolean impliesObjectChanged() {
         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/callbacks/update/UpdatedCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatedCallbackFacetViaMethod.java
index e052bf3..3cf2a97 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatedCallbackFacetViaMethod.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;
 
 public class UpdatedCallbackFacetViaMethod extends UpdatedCallbackFacetAbstract implements ImperativeFacet {
 
@@ -49,6 +50,11 @@ public class UpdatedCallbackFacetViaMethod extends UpdatedCallbackFacetAbstract
     }
 
     @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/callbacks/update/UpdatingCallbackFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatingCallbackFacetViaMethod.java
index f2bcee9..69256cd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/callbacks/update/UpdatingCallbackFacetViaMethod.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;
 
 public class UpdatingCallbackFacetViaMethod extends UpdatingCallbackFacetAbstract implements ImperativeFacet {
 
@@ -49,6 +50,11 @@ public class UpdatingCallbackFacetViaMethod extends UpdatingCallbackFacetAbstrac
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.LIFECYCLE;
+    }
+
+    @Override
     public boolean impliesResolve() {
         return false;
     }