You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/09/03 13:03:01 UTC

[isis] branch master updated: ISIS-2774: make layout- and cssClass-facet imperative

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 765b994  ISIS-2774: make layout- and cssClass-facet imperative
765b994 is described below

commit 765b9940e7b0e12db84ede200c49a4ade74e1187
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 3 15:01:14 2021 +0200

    ISIS-2774: make layout- and cssClass-facet imperative
    
    fixes MM validation on object support methods
---
 .../method/CssClassFacetMethodFactory.java         | 19 ++++-----
 ...od.java => CssClassFacetViaCssClassMethod.java} | 48 ++++++++++++++--------
 ...sClassFacetForDomainObjectLayoutAnnotation.java |  4 +-
 .../object/icon/method/IconFacetMethodFactory.java |  1 -
 .../icon/method/IconFacetViaIconNameMethod.java    |  7 +++-
 .../facets/object/layout/LayoutFacetFactory.java   | 28 ++++++-------
 ...Method.java => LayoutFacetViaLayoutMethod.java} | 37 +++++++++++++----
 .../title/methods/TitleFacetViaMethodsFactory.java |  4 +-
 ...tionEnforcesMetamodelContributionValidator.java | 11 +++--
 .../metamodel/methods/MethodLiteralConstants.java  | 11 +++--
 .../cssclass/CssClassFacetMethodFactoryTest.java   |  4 +-
 .../ident/cssclass/CssClassFacetMethodTest.java    |  6 +--
 .../CssClassFacetMethodWithProblemTest.java        |  6 +--
 .../ident/layout/LayoutFacetFactoryTest.java       |  4 +-
 .../object/ident/layout/LayoutFacetMethodTest.java |  6 +--
 .../good/ProperMemberInheritanceAbstract.java      | 10 +++++
 16 files changed, 125 insertions(+), 81 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
index 5001ed3..5b10711 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
@@ -18,42 +18,41 @@
  */
 package org.apache.isis.core.metamodel.facets.object.cssclass.method;
 
-import java.lang.reflect.Method;
-
 import javax.inject.Inject;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
+import lombok.val;
+
 public class CssClassFacetMethodFactory
 extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final String PREFIX = MethodLiteralConstants.CSS_CLASS;
+    private static final String METHOD_NAME = MethodLiteralConstants.CSS_CLASS;
 
     @Inject
     public CssClassFacetMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(METHOD_NAME));
     }
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        final Class<?> cls = processClassContext.getCls();
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+        val cls = processClassContext.getCls();
+        val facetHolder = processClassContext.getFacetHolder();
 
-        final Method method = MethodFinderUtils.findMethod(
+        val method = MethodFinderUtils.findMethod(
                 MethodFinderOptions
                 .objectSupport(processClassContext.getIntrospectionPolicy()),
-                cls, PREFIX, String.class, NO_ARG);
+                cls, METHOD_NAME, String.class, NO_ARG);
         if (method == null) {
             return;
         }
         processClassContext.removeMethod(method);
-        addFacet(new CssClassFacetMethod(method, facetHolder));
+        addFacet(new CssClassFacetViaCssClassMethod(method, facetHolder));
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java
similarity index 59%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java
index abcfdf3..d7d6d46 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclass/method/CssClassFacetViaCssClassMethod.java
@@ -22,44 +22,58 @@ package org.apache.isis.core.metamodel.facets.object.cssclass.method;
 import java.lang.reflect.Method;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 
-public class CssClassFacetMethod
-extends FacetAbstract
-implements CssClassFacet {
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.val;
 
-    private static final Class<? extends Facet> type() {
-        return CssClassFacet.class;
-    }
-
-    private final Method method;
+public class CssClassFacetViaCssClassMethod
+extends CssClassFacetAbstract
+implements ImperativeFacet {
 
+    @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
 
-    public CssClassFacetMethod(final Method method, final FacetHolder holder) {
-        super(type(), holder);
-        this.method = method;
+    public CssClassFacetViaCssClassMethod(final Method method, final FacetHolder holder) {
+        super(holder);
+        this.methods = ImperativeFacet.singleMethod(method);
     }
 
     @Override
-    public String cssClass(final ManagedObject owningAdapter) {
-        if(owningAdapter == null) {
+    public String cssClass(final ManagedObject domainObject) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(domainObject)) {
             return "";
         }
         try {
-            return (String) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
+            val method = methods.getFirstOrFail();
+            return (String) ManagedObjects.InvokeUtil.invoke(method, domainObject);
         } catch (final RuntimeException ex) {
             return null;
         }
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.UI_HINT;
+    }
+
+    @Override
+    protected String toStringValues() {
+        val method = methods.getFirstOrFail();
+        return "method=" + method;
+    }
+
+    @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
+        val method = methods.getFirstOrFail();
         super.visitAttributes(visitor);
+        ImperativeFacet.visitAttributes(this, visitor);
         visitor.accept("method", method);
     }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
index 590ef6b..f0ffbb9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
@@ -23,7 +23,7 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetSimple;
-import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod;
 
 public class CssClassFacetForDomainObjectLayoutAnnotation extends CssClassFacetSimple {
 
@@ -38,7 +38,7 @@ public class CssClassFacetForDomainObjectLayoutAnnotation extends CssClassFacetS
         // a result of the cssClass attribute, but also as a result of the cssClassUiEvent.  The former has lower
         // "priority" to the cssClass() method, but the latter has *higher* priority.  Hence the special casing
         // that is required here.
-        if(facet != null && facet instanceof CssClassFacetMethod) {
+        if(facet != null && facet instanceof CssClassFacetViaCssClassMethod) {
             // don't overwrite
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetMethodFactory.java
index 0b42c28..9df0584 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetMethodFactory.java
@@ -16,7 +16,6 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.icon.method;
 
 import javax.inject.Inject;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java
index 8c83d44..85887d7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/icon/method/IconFacetViaIconNameMethod.java
@@ -45,10 +45,13 @@ implements ImperativeFacet {
     }
 
     @Override
-    public String iconName(final ManagedObject owningAdapter) {
+    public String iconName(final ManagedObject domainObject) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(domainObject)) {
+            return null;
+        }
         try {
             val method = methods.getFirstOrFail();
-            return (String) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
+            return (String) ManagedObjects.InvokeUtil.invoke(method, domainObject);
         } catch (final RuntimeException ex) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
index c12f40b..ff0a967 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetFactory.java
@@ -19,43 +19,39 @@
 
 package org.apache.isis.core.metamodel.facets.object.layout;
 
-import java.lang.reflect.Method;
-
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
+import lombok.val;
+
 public class LayoutFacetFactory
 extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final String PREFIX = MethodLiteralConstants.LAYOUT;
+    private static final String METHOD_NAME = MethodLiteralConstants.LAYOUT;
 
     public LayoutFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(METHOD_NAME));
     }
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        final Class<?> cls = processClassContext.getCls();
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+        val cls = processClassContext.getCls();
+        val facetHolder = processClassContext.getFacetHolder();
 
-        final Method method = MethodFinderUtils.findMethod(
+        val method = MethodFinderUtils.findMethod(
                 MethodFinderOptions
                 .objectSupport(processClassContext.getIntrospectionPolicy()),
-                cls, PREFIX, String.class, NO_ARG);
-
-        final LayoutFacet layoutFacet;
+                cls, METHOD_NAME, String.class, NO_ARG);
         if (method == null) {
-            layoutFacet = new LayoutFacetFallback(facetHolder);
-        } else {
-            processClassContext.removeMethod(method);
-            layoutFacet = new LayoutFacetMethod(method, facetHolder);
+            addFacet(new LayoutFacetFallback(facetHolder));
+            return;
         }
-        addFacet(layoutFacet);
+        processClassContext.removeMethod(method);
+        addFacet(new LayoutFacetViaLayoutMethod(method, facetHolder));
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetViaLayoutMethod.java
similarity index 59%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetViaLayoutMethod.java
index f8f6255..371f440 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layout/LayoutFacetViaLayoutMethod.java
@@ -22,35 +22,56 @@ package org.apache.isis.core.metamodel.facets.object.layout;
 import java.lang.reflect.Method;
 import java.util.function.BiConsumer;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 
-public class LayoutFacetMethod
-extends LayoutFacetAbstract {
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.val;
 
-    private final Method method;
+public class LayoutFacetViaLayoutMethod
+extends LayoutFacetAbstract
+implements ImperativeFacet {
 
-    public LayoutFacetMethod(final Method method, final FacetHolder holder) {
+    @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
+
+    public LayoutFacetViaLayoutMethod(final Method method, final FacetHolder holder) {
         super(holder);
-        this.method = method;
+        this.methods = ImperativeFacet.singleMethod(method);
     }
 
     @Override
-    public String layout(final ManagedObject objectAdapterIfAny) {
-        if(objectAdapterIfAny == null) {
+    public String layout(final ManagedObject domainObject) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(domainObject)) {
             return null;
         }
         try {
-            return (String) ManagedObjects.InvokeUtil.invoke(method, objectAdapterIfAny);
+            val method = methods.getFirstOrFail();
+            return (String) ManagedObjects.InvokeUtil.invoke(method, domainObject);
         } catch (final RuntimeException ex) {
             return null;
         }
     }
 
     @Override
+    public Intent getIntent(final Method method) {
+        return Intent.UI_HINT;
+    }
+
+    @Override
+    protected String toStringValues() {
+        val method = methods.getFirstOrFail();
+        return "method=" + method;
+    }
+
+    @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
+        val method = methods.getFirstOrFail();
         super.visitAttributes(visitor);
+        ImperativeFacet.visitAttributes(this, visitor);
         visitor.accept("method", method);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
index 29888c2..f3ed35e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaMethodsFactory.java
@@ -50,13 +50,13 @@ import lombok.val;
 public class TitleFacetViaMethodsFactory
 extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofCollection(_Lists.of(
+    private static final Can<String> METHOD_NAMES = Can.ofCollection(_Lists.of(
             TO_STRING,
             TITLE));
 
     @Inject
     public TitleFacetViaMethodsFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, METHOD_NAMES);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
index 9794669..0f2dca0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
@@ -41,6 +41,7 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectMemberAbstract;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelVisitingValidatorAbstract;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 
@@ -118,7 +119,8 @@ extends MetaModelVisitingValidatorAbstract {
 
         // find reasons about why these are not recognized
         notRecognizedMethods.forEach(notRecognizedMethod->{
-            final List<String> unmetContraints = unmetContraints(spec, notRecognizedMethod);
+            final List<String> unmetContraints =
+                    unmetContraints((ObjectSpecificationAbstract) spec, notRecognizedMethod);
 
             //FIXME[ISIS-2774] - update message to a more generic one
             String messageFormat = "%s#%s: has annotation @%s, is assumed to support "
@@ -138,13 +140,14 @@ extends MetaModelVisitingValidatorAbstract {
     // -- VALIDATION LOGIC
 
     private List<String> unmetContraints(
-            final ObjectSpecification spec,
+            final ObjectSpecificationAbstract spec,
             final Method method) {
 
         //val type = spec.getCorrespondingClass();
-        final List<String> unmetContraints = _Lists.<String>newArrayList();
+        val unmetContraints = _Lists.<String>newArrayList();
 
-        if (!MethodUtil.isPublic(method)) {
+        if(!spec.getIntrospectionPolicy().getEncapsulationPolicy().isEncapsulatedMembersSupported()
+                && !MethodUtil.isPublic(method)) {
             unmetContraints.add("method must be 'public'");
             return unmetContraints; // don't check any further
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java
index 9ea4df7..630c7cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java
@@ -60,6 +60,11 @@ public final class MethodLiteralConstants {
     public static final String DISABLED = "disabled"; // for batch disabling all members
     public static final String HIDDEN = "hidden"; // for batch hiding all members
 
+    public static final String TITLE = "title";
+    public static final String CSS_CLASS = "cssClass";
+    public static final String ICON_NAME = "iconName";
+    public static final String LAYOUT = "layout";
+
     // -- MEMBER SUPPORT
 
     public static final String DEFAULT_PREFIX = "default";
@@ -73,12 +78,6 @@ public final class MethodLiteralConstants {
     public static final String NAMED_PREFIX = "named"; // dynamic naming
     public static final String DESCRIBED_PREFIX = "described"; // dynamic description
 
-    // -- LAYOUT SUPPORT
-
-    public static final String TITLE = "title";
-    public static final String CSS_CLASS = "cssClass";
-    public static final String ICON_NAME = "iconName";
-    public static final String LAYOUT = "layout";
 
     // -- OTHER LITERALS
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java
index 0641139..50a532d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java
@@ -30,7 +30,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
-import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod;
 import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethodFactory;
 
 public class CssClassFacetMethodFactoryTest
@@ -65,7 +65,7 @@ extends AbstractFacetFactoryTest {
 
         final Facet facet = facetedMethod.getFacet(CssClassFacet.class);
         assertThat(facet, is(notNullValue()));
-        assertThat(facet, is(instanceOf(CssClassFacetMethod.class)));
+        assertThat(facet, is(instanceOf(CssClassFacetViaCssClassMethod.class)));
 
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(cssClassNameMethod));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java
index c23e9ca..71439df 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java
@@ -29,7 +29,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 import static org.hamcrest.CoreMatchers.equalTo;
@@ -41,7 +41,7 @@ public class CssClassFacetMethodTest {
     public static final String CSS_CLASS = "someCssClass";
     private final Mockery mockery = new JUnit4Mockery();
 
-    private CssClassFacetMethod facet;
+    private CssClassFacetViaCssClassMethod facet;
     private FacetHolder mockFacetHolder;
 
     private ManagedObject mockOwningAdapter;
@@ -61,7 +61,7 @@ public class CssClassFacetMethodTest {
         mockFacetHolder = mockery.mock(FacetHolder.class);
         mockOwningAdapter = mockery.mock(ManagedObject.class);
         final Method iconNameMethod = DomainObjectInCssClassMethod.class.getMethod("cssClass");
-        facet = new CssClassFacetMethod(iconNameMethod, mockFacetHolder);
+        facet = new CssClassFacetViaCssClassMethod(iconNameMethod, mockFacetHolder);
 
         mockery.checking(new Expectations() {
             {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java
index ee4dd30..bc8f61d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java
@@ -29,7 +29,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -40,7 +40,7 @@ public class CssClassFacetMethodWithProblemTest {
 
     private final Mockery mockery = new JUnit4Mockery();
 
-    private CssClassFacetMethod facet;
+    private CssClassFacetViaCssClassMethod facet;
     private FacetHolder mockFacetHolder;
 
     private ManagedObject mockOwningAdapter;
@@ -60,7 +60,7 @@ public class CssClassFacetMethodWithProblemTest {
         mockFacetHolder = mockery.mock(FacetHolder.class);
         mockOwningAdapter = mockery.mock(ManagedObject.class);
         final Method iconNameMethod = DomainObjectWithProblemInCssClassMethod.class.getMethod("cssClass");
-        facet = new CssClassFacetMethod(iconNameMethod, mockFacetHolder);
+        facet = new CssClassFacetViaCssClassMethod(iconNameMethod, mockFacetHolder);
 
         mockery.checking(new Expectations() {
             {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java
index a664c4f..61e6c4d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetViaLayoutMethod;
 
 public class LayoutFacetFactoryTest extends AbstractFacetFactoryTest {
 
@@ -64,7 +64,7 @@ public class LayoutFacetFactoryTest extends AbstractFacetFactoryTest {
 
         final Facet facet = facetedMethod.getFacet(LayoutFacet.class);
         assertThat(facet, is(notNullValue()));
-        assertThat(facet, is(instanceOf(LayoutFacetMethod.class)));
+        assertThat(facet, is(instanceOf(LayoutFacetViaLayoutMethod.class)));
 
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
index cc83dcb..efdf717 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
@@ -29,7 +29,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetMethod;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetViaLayoutMethod;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -40,7 +40,7 @@ public class LayoutFacetMethodTest {
 
     private final Mockery mockery = new JUnit4Mockery();
 
-    private LayoutFacetMethod facet;
+    private LayoutFacetViaLayoutMethod facet;
     private FacetHolder mockFacetHolder;
 
     private ManagedObject mockOwningAdapter;
@@ -60,7 +60,7 @@ public class LayoutFacetMethodTest {
         mockFacetHolder = mockery.mock(FacetHolder.class);
         mockOwningAdapter = mockery.mock(ManagedObject.class);
         final Method iconNameMethod = DomainObjectWithProblemInLayoutMethod.class.getMethod("layout");
-        facet = new LayoutFacetMethod(iconNameMethod, mockFacetHolder);
+        facet = new LayoutFacetViaLayoutMethod(iconNameMethod, mockFacetHolder);
 
         mockery.checking(new Expectations() {
             {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberInheritanceAbstract.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberInheritanceAbstract.java
index 6670f5e..9e9d110 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberInheritanceAbstract.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberInheritanceAbstract.java
@@ -44,6 +44,16 @@ abstract class ProperMemberInheritanceAbstract {
         return "inherited icon";
     }
 
+    @ObjectSupport
+    public String cssClass(){
+        return "another-class";
+    }
+
+    @ObjectSupport
+    public String layout(){
+        return "layout";
+    }
+
     @Action
     @ActionLayout(named = "foo", describedAs = "bar")
     public void sampleAction() {