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/07 11:04:27 UTC

[isis] 02/02: ISIS-2774: more rigorous member prefix declarations (use enums)

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

commit c975099f57e7c02a26dd27c60b255afcb7550b50
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 7 13:04:14 2021 +0200

    ISIS-2774: more rigorous member prefix declarations (use enums)
    
    also removes object support method String/TranslatableString validate()
---
 .../org/apache/isis/commons/collections/Can.java   |  14 ++
 .../progmodel/ProgrammingModelConstants.java       |  24 ++-
 .../method/ActionDefaultsFacetViaMethod.java       |  82 --------
 .../ActionDefaultsFacetViaMethodFactory.java       |  86 ---------
 .../ActionValidationFacetViaMethodFactory.java     |  14 +-
 .../DescribedAsFacetForMemberViaMethodFactory.java |  14 +-
 .../DisableForContextFacetViaMethodFactory.java    |  18 +-
 .../HideForContextFacetViaMethodFactory.java       |  18 +-
 .../NamedFacetForMemberViaMethodFactory.java       |  19 +-
 .../validateobject/ValidateObjectFacet.java        |  54 ------
 .../ValidateObjectFacetAbstract.java               |  49 -----
 .../method/ValidateObjectFacetMethod.java          |  72 -------
 .../method/ValidateObjectFacetMethodFactory.java   |  69 -------
 ...ParameterAutoCompleteFacetViaMethodFactory.java |  14 +-
 .../method/ActionChoicesFacetViaMethod.java        | 102 ----------
 .../method/ActionChoicesFacetViaMethodFactory.java | 100 ----------
 ...ctionParameterChoicesFacetViaMethodFactory.java |  14 +-
 ...tionParameterDefaultsFacetViaMethodFactory.java |  15 +-
 ...tionParameterDisabledFacetViaMethodFactory.java |  14 +-
 ...ActionParameterHiddenFacetViaMethodFactory.java |  14 +-
 ...onParameterValidationFacetViaMethodFactory.java |  16 +-
 .../PropertyAutoCompleteFacetMethodFactory.java    |  20 +-
 .../PropertyChoicesFacetViaMethodFactory.java      |  22 +--
 .../PropertyDefaultFacetViaMethodFactory.java      |  20 +-
 .../PropertyValidateFacetViaMethodFactory.java     |  19 +-
 .../methods/MemberSupportFacetFactoryAbstract.java |  42 ++++
 .../MethodPrefixBasedFacetFactoryAbstract.java     |   8 +-
 .../dflt/ProgrammingModelFacetsJava11.java         |   6 -
 .../specloader/specimpl/FacetedMethodsBuilder.java |  29 ---
 .../actions/ActionMethodsFacetFactoryTest.java     | 215 ---------------------
 .../ObjectValidMethodFacetFactoryTest.java         |  65 -------
 .../facets/param/name/ParameterNameFacetTest.java  |   2 +-
 32 files changed, 172 insertions(+), 1098 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/collections/Can.java b/commons/src/main/java/org/apache/isis/commons/collections/Can.java
index a6f4566..5c1e293 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/Can.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/Can.java
@@ -410,6 +410,20 @@ extends Iterable<T>, Comparable<Can<T>>, Serializable {
         return _CanFactory.ofNonNullElements(nonNullMappedElements);
     }
 
+    default <R> Can<R> flatMap(final @NonNull Function<? super T, ? extends Can<? extends R>> mapper) {
+
+        if(isEmpty()) {
+            return empty();
+        }
+
+        return
+                stream()
+                .map(mapper)
+                .filter(_NullSafe::isPresent)
+                .flatMap(Can::stream)
+                .collect(Can.toCan());
+    }
+
     // -- CONCATENATION
 
     /**
diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
index e5e83c8..c13ea0b 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
@@ -174,17 +174,25 @@ public final class ProgrammingModelConstants {
 
     // -- MEMBER SUPPORT PREFIXES
 
-    public static final String DEFAULT_PREFIX = "default";
-    public static final String CHOICES_PREFIX = "choices";
-    public static final String AUTO_COMPLETE_PREFIX = "autoComplete";
+    @Getter
+    public static enum MemberSupportPrefix {
+        DEFAULT("default"),
+        CHOICES("choices"),
+        AUTO_COMPLETE("autoComplete"),
+        HIDE("hide"),
+        DISABLE("disable"),
+        VALIDATE("validate"),
+        NAMED("named"), // imperative naming
+        DESCRIBED("described"); // imperative naming
+        MemberSupportPrefix(
+                final String ...methodNamePrefixes) {
+            this.methodNamePrefixes = Can.of(methodNamePrefixes);
+        }
+        private final Can<String> methodNamePrefixes;
+    }
 
-    public static final String HIDE_PREFIX = "hide";
-    public static final String DISABLE_PREFIX = "disable";
     public static final String VALIDATE_PREFIX = "validate";
 
-    public static final String NAMED_PREFIX = "named"; // dynamic naming
-    public static final String DESCRIBED_PREFIX = "described"; // dynamic description
-
     // -- OTHER LITERALS
 
     public static final String TO_STRING = "toString";
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
deleted file mode 100644
index 5a210d5..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
+++ /dev/null
@@ -1,82 +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.actions.defaults.method;
-
-import java.lang.reflect.Method;
-import java.util.function.BiConsumer;
-
-import org.apache.isis.commons.collections.Can;
-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.actions.action.invocation.ActionInvocationFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract;
-import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-import lombok.Getter;
-import lombok.NonNull;
-import lombok.val;
-
-public class ActionDefaultsFacetViaMethod
-extends ActionDefaultsFacetAbstract
-implements ImperativeFacet {
-
-    @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
-
-    @SuppressWarnings("unused")
-    private final Method actionMethod;
-
-    public ActionDefaultsFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        this.methods = ImperativeFacet.singleMethod(method);
-        this.actionMethod = determineActionMethod(holder);
-    }
-
-    private static Method determineActionMethod(final FacetHolder holder) {
-        Method method2;
-        final Facet actionInvocationFacet = holder.getFacet(ActionInvocationFacet.class);
-        if (actionInvocationFacet instanceof ActionInvocationFacetForDomainEventAbstract) {
-            final ActionInvocationFacetForDomainEventAbstract facetViaMethod = (ActionInvocationFacetForDomainEventAbstract) actionInvocationFacet;
-            method2 = facetViaMethod.getMethods().getFirstOrFail();
-        } else {
-            method2 = null;
-        }
-        return method2;
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.DEFAULTS;
-    }
-
-    @Override
-    public Object[] getDefaults(final ManagedObject owningAdapter) {
-        val method = methods.getFirstOrFail();
-        return (Object[]) ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-    }
-
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        ImperativeFacet.visitAttributes(this, visitor);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
deleted file mode 100644
index 8c23a80..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
+++ /dev/null
@@ -1,86 +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.actions.defaults.method;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinder;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-/**
- * Sets up all the {@link Facet}s for an action in a single shot.
- */
-public class ActionDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.DEFAULT_PREFIX;
-
-    @Inject
-    public ActionDefaultsFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(processMethodContext);
-    }
-
-    private void attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(
-            final ProcessMethodContext processMethodContext) {
-
-        Method defaultsMethod = findDefaultsMethodReturning(processMethodContext, Object[].class);
-        if (defaultsMethod == null) {
-            defaultsMethod = findDefaultsMethodReturning(processMethodContext, List.class);
-        }
-        if (defaultsMethod == null) {
-            return;
-        }
-
-        processMethodContext.removeMethod(defaultsMethod);
-
-        val facetedMethod = processMethodContext.getFacetHolder();
-        addFacet(new ActionDefaultsFacetViaMethod(defaultsMethod, facetedMethod));
-    }
-
-    private static Method findDefaultsMethodReturning(
-            final ProcessMethodContext processMethodContext,
-            final Class<?> returnType) {
-
-        val cls = processMethodContext.getCls();
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
-        return MethodFinder.findMethod(
-                MethodFinderOptions
-                .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                cls, methodNameCandidates, returnType, NO_ARG)
-                .findFirst()
-                .orElse(null);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
index 4b4a97f..1fb5cdb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
@@ -24,15 +24,14 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.ActionSupport;
 import org.apache.isis.core.metamodel.facets.ActionSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
 import org.apache.isis.core.metamodel.facets.param.validate.method.ActionParameterValidationFacetViaMethod;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
@@ -40,13 +39,11 @@ import lombok.val;
  * Sets up {@link ActionValidationFacet} and {@link ActionParameterValidationFacetViaMethod}.
  */
 public class ActionValidationFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final String PREFIX = ProgrammingModelConstants.VALIDATE_PREFIX;
+extends MemberSupportFacetFactoryAbstract  {
 
     @Inject
     public ActionValidationFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.VALIDATE);
     }
 
     @Override
@@ -58,7 +55,8 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         val facetHolder = processMethodContext.getFacetHolder();
 
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val searchRequest = ActionSupport.ActionSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
index f68aceb..61f009f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
@@ -20,25 +20,22 @@ package org.apache.isis.core.metamodel.facets.members.described.method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
 public class DescribedAsFacetForMemberViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.DESCRIBED_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public DescribedAsFacetForMemberViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.MEMBERS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.MEMBERS, MemberSupportPrefix.DESCRIBED);
     }
 
     @Override
@@ -52,7 +49,8 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         val cls = processMethodContext.getCls();
         //val actionOrGetter = processMethodContext.getMethod();
 
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val describedMethod = MethodFinder.findMethod_returningText(
                 MethodFinderOptions
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
index 31ded65..9c28ebd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
@@ -23,32 +23,25 @@ import java.lang.reflect.Method;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
 public class DisableForContextFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final String PREFIX = ProgrammingModelConstants.DISABLE_PREFIX;
+extends MemberSupportFacetFactoryAbstract  {
 
     @Inject
     public DisableForContextFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.MEMBERS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.MEMBERS, MemberSupportPrefix.DISABLE);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        attachDisabledFacetIfDisabledMethodIsFound(processMethodContext);
-    }
-
-    private void attachDisabledFacetIfDisabledMethodIsFound(final ProcessMethodContext processMethodContext) {
 
         val actionOrGetter = processMethodContext.getMethod();
 
@@ -56,7 +49,8 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         Method disableMethod = null;
 
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
         boolean searchExactMatch = !noParamsOnly;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
index 7858715..9e9662b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
@@ -22,38 +22,32 @@ import java.lang.reflect.Method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
 public class HideForContextFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.HIDE_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public HideForContextFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.MEMBERS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.MEMBERS, MemberSupportPrefix.HIDE);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        attachHideFacetIfHideMethodIsFound(processMethodContext);
-    }
-
-    private void attachHideFacetIfHideMethodIsFound(final ProcessMethodContext processMethodContext) {
 
         final Method actionOrGetter = processMethodContext.getMethod();
 
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val cls = processMethodContext.getCls();
         Method hideMethod = MethodFinder.findMethod(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
index 6dd91f8..85df7fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
@@ -20,39 +20,32 @@ package org.apache.isis.core.metamodel.facets.members.named.method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
 public class NamedFacetForMemberViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.NAMED_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public NamedFacetForMemberViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.MEMBERS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.MEMBERS, MemberSupportPrefix.NAMED);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        addNamedFacetIfNamedMethodIsFound(processMethodContext);
-    }
-
-    private void addNamedFacetIfNamedMethodIsFound(
-            final ProcessMethodContext processMethodContext) {
 
         val cls = processMethodContext.getCls();
         //val actionOrGetter = processMethodContext.getMethod();
 
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val namedMethod = MethodFinder.findMethod_returningText(
                 MethodFinderOptions
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacet.java
deleted file mode 100644
index c5978c8..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacet.java
+++ /dev/null
@@ -1,54 +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.object.validating.validateobject;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet;
-import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-/**
- * Mechanism for determining whether this object is in a valid state, for
- * example so that it can be persisted or updated.
- *
- * <p>
- * Even though all the properties of an object may themselves be valid, there
- * could be inter-property dependencies which are invalid. For example
- * <tt>fromDate</tt> > <tt>toDate</tt> would probably represent an invalid
- * state.
- *
- * <p>
- * In the standard Apache Isis Programming Model, typically corresponds to the
- * <tt>validate</tt> method.
- *
- * @see PersistingCallbackFacet
- * @see UpdatingCallbackFacet
- */
-public interface ValidateObjectFacet extends Facet, ValidatingInteractionAdvisor {
-
-    /**
-     * The reason the object is invalid.
-     *
-     * <p>
-     * . If the object is actually valid, should return <tt>null</tt>.
-     */
-    public String invalidReason(ManagedObject adapter);
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java
deleted file mode 100644
index 2de2397..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java
+++ /dev/null
@@ -1,49 +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.object.validating.validateobject;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public abstract class ValidateObjectFacetAbstract
-extends FacetAbstract
-implements ValidateObjectFacet {
-
-    private static final Class<? extends Facet> type() {
-        return ValidateObjectFacet.class;
-    }
-
-    public ValidateObjectFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
-    }
-
-    @Override
-    public String invalidates(final ValidityContext vc) {
-        if (!(vc instanceof ObjectValidityContext)) {
-            return null;
-        }
-        final ManagedObject toValidate = vc.getTarget();
-        return toValidate != null ? invalidReason(toValidate) : null;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethod.java
deleted file mode 100644
index 8b7328b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethod.java
+++ /dev/null
@@ -1,72 +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.object.validating.validateobject.method;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.applib.services.i18n.TranslatableString;
-import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.applib.services.i18n.TranslationService;
-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.facets.object.validating.validateobject.ValidateObjectFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-import lombok.Getter;
-import lombok.NonNull;
-import lombok.val;
-
-public class ValidateObjectFacetMethod
-extends ValidateObjectFacetAbstract
-implements ImperativeFacet {
-
-    @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
-    private final TranslationService translationService;
-    private final TranslationContext translationContext;
-
-    public ValidateObjectFacetMethod(final Method method, final TranslationService translationService,
-    		final TranslationContext translationContext, final FacetHolder holder) {
-        super(holder);
-        this.methods = ImperativeFacet.singleMethod(method);
-        this.translationService = translationService;
-        this.translationContext = translationContext;
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.CHECK_IF_VALID;
-    }
-
-    @Override
-    public String invalidReason(final ManagedObject owningAdapter) {
-        val method = methods.getFirstOrFail();
-        final Object returnValue = ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        if(returnValue instanceof String) {
-            return (String) returnValue;
-        }
-        if(returnValue instanceof TranslatableString) {
-            final TranslatableString ts = (TranslatableString) returnValue;
-            return ts.translate(translationService, translationContext);
-        }
-        return null;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java
deleted file mode 100644
index 96fdea8..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java
+++ /dev/null
@@ -1,69 +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.object.validating.validateobject.method;
-
-import java.lang.reflect.Method;
-
-import javax.inject.Inject;
-
-import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class ValidateObjectFacetMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.VALIDATE_PREFIX;
-
-    @Inject
-    public ValidateObjectFacetMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> cls = processClassContext.getCls();
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
-
-        final Method method = MethodFinderUtils.findMethod_returningText(
-                MethodFinderOptions
-                .objectSupport(processClassContext.getIntrospectionPolicy()),
-                cls,
-                PREFIX,
-                NO_ARG);
-        if (method != null) {
-            val translationService = getTranslationService();
-            // sadness: same as in TranslationFactory
-            val translationContext = TranslationContext.forTranslationContextHolder(
-                    facetHolder.getFeatureIdentifier());
-            FacetUtil.addFacet(new ValidateObjectFacetMethod(method, translationService, translationContext, facetHolder));
-            processClassContext.removeMethod(method);
-        }
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index 4c8f2d6..dd5da4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -23,26 +23,23 @@ import java.util.EnumSet;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
 public class ActionParameterAutoCompleteFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.AUTO_COMPLETE_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public ActionParameterAutoCompleteFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.AUTO_COMPLETE);
     }
 
     @Override
@@ -57,7 +54,8 @@ extends MethodPrefixBasedFacetFactoryAbstract {
 
         // attach ActionParameterChoicesFacet if autoCompleteNumMethod is found ...
 
-        val methodNameCandidates = processMethodContext.parameterSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::parameterSupportCandidates);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
deleted file mode 100644
index ac59ac9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
+++ /dev/null
@@ -1,102 +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.param.choices.method;
-
-import java.lang.reflect.Method;
-import java.util.function.BiConsumer;
-
-import org.apache.isis.applib.exceptions.unrecoverable.DomainModelException;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.collections.CanVector;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
-
-import lombok.Getter;
-import lombok.NonNull;
-import lombok.val;
-
-public class ActionChoicesFacetViaMethod
-extends ActionChoicesFacetAbstract
-implements ImperativeFacet {
-
-    @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
-    private final Class<?> choicesType;
-
-    public ActionChoicesFacetViaMethod(
-            final Method method,
-            final Class<?> choicesType,
-            final FacetHolder holder) {
-
-        super(holder);
-        this.methods = ImperativeFacet.singleMethod(method);
-        this.choicesType = choicesType;
-    }
-
-    @Override
-    public Intent getIntent(final Method method) {
-        return Intent.CHOICES_OR_AUTOCOMPLETE;
-    }
-
-    @Override
-    public CanVector<ManagedObject> getChoices(
-            final ManagedObject owningAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        val method = methods.getFirstOrFail();
-        final Object objectOrCollection = ManagedObjects.InvokeUtil.invoke(method, owningAdapter);
-        if (!(objectOrCollection instanceof Object[])) {
-            throw new DomainModelException(String.format(
-                    "Expected an array of collections (Object[]) containing choices for all parameters, "
-                            + "but got %s instead. Perhaps the parameter number is missing?",
-                            objectOrCollection));
-        }
-        final Object[] options = (Object[]) objectOrCollection;
-
-        val choicesVector = new CanVector<ManagedObject>(options.length);
-        val parameterTypes = method.getParameterTypes();
-
-        for (int i = 0; i < choicesVector.size(); i++) {
-            choicesVector.set(i, handleResults(options[i], parameterTypes[i], interactionInitiatedBy));
-        }
-        return choicesVector;
-    }
-
-    private Can<ManagedObject> handleResults(
-            final Object collectionOrArray,
-            final Class<?> parameterType,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        val elementSpec = specForTypeElseFail(parameterType);
-        val visibleChoices = ManagedObjects
-                .adaptMultipleOfTypeThenAttachThenFilterByVisibility(
-                        elementSpec, collectionOrArray, interactionInitiatedBy);
-        return visibleChoices;
-    }
-
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        ImperativeFacet.visitAttributes(this, visitor);
-        visitor.accept("choicesType", choicesType);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
deleted file mode 100644
index 1cc8ef9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
+++ /dev/null
@@ -1,100 +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.param.choices.method;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
-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.MethodFinder;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class ActionChoicesFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.CHOICES_PREFIX;
-
-    @Inject
-    public ActionChoicesFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        attachActionChoicesFacetIfParameterChoicesMethodIsFound(processMethodContext);
-    }
-
-    private void attachActionChoicesFacetIfParameterChoicesMethodIsFound(final ProcessMethodContext processMethodContext) {
-
-        val actionMethod = processMethodContext.getMethod();
-
-        if (actionMethod.getParameterCount() <= 0) {
-            return;
-        }
-
-        Method choicesMethod = null;
-        if (choicesMethod == null) {
-            choicesMethod = findChoicesMethodReturning(processMethodContext, Object[][].class);
-        }
-        if (choicesMethod == null) {
-            choicesMethod = findChoicesMethodReturning(processMethodContext, Object[].class);
-        }
-        if (choicesMethod == null) {
-            choicesMethod = findChoicesMethodReturning(processMethodContext, Collection.class);
-        }
-        if (choicesMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(choicesMethod);
-
-        final Class<?> returnType = actionMethod.getReturnType();
-        final FacetHolder action = processMethodContext.getFacetHolder();
-
-        addFacet(new ActionChoicesFacetViaMethod(choicesMethod, returnType, action));
-
-    }
-
-    protected Method findChoicesMethodReturning(
-            final ProcessMethodContext processMethodContext,
-            final Class<?> returnType) {
-
-        val cls = processMethodContext.getCls();
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
-
-        Method choicesMethod =
-                MethodFinder.findMethod(
-                        MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        cls, methodNameCandidates, returnType, NO_ARG)
-                .findFirst()
-                .orElse(null);
-        return choicesMethod;
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index 3cf48d5..85949dc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -23,26 +23,23 @@ import java.util.EnumSet;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
 public class ActionParameterChoicesFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.CHOICES_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public ActionParameterChoicesFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.CHOICES);
     }
 
     // ///////////////////////////////////////////////////////
@@ -61,7 +58,8 @@ extends MethodPrefixBasedFacetFactoryAbstract {
 
         // attach ActionChoicesFacet if choicesNumMethod is found ...
 
-        val methodNameCandidates = processMethodContext.parameterSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::parameterSupportCandidates);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
index 7c9476b..530030e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
@@ -23,8 +23,7 @@ import java.util.EnumSet;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -32,20 +31,19 @@ import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
 /**
  * Sets up all the {@link Facet}s for an action in a single shot.
  */
-public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.DEFAULT_PREFIX;
+public class ActionParameterDefaultsFacetViaMethodFactory
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public ActionParameterDefaultsFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.DEFAULT);
     }
 
     // ///////////////////////////////////////////////////////
@@ -65,7 +63,8 @@ public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBa
         // attach DefaultFacetForParameters if defaultNumMethod is found ...
 
         val actionMethod = processMethodContext.getMethod();
-        val methodNameCandidates = processMethodContext.parameterSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::parameterSupportCandidates);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
index a64d5fe..1f36297 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
@@ -24,15 +24,14 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacet;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
@@ -40,13 +39,11 @@ import lombok.val;
  * Sets up {@link ActionParameterDisabledFacet}.
  */
 public class ActionParameterDisabledFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final String PREFIX = ProgrammingModelConstants.DISABLE_PREFIX;
+extends MemberSupportFacetFactoryAbstract  {
 
     @Inject
     public ActionParameterDisabledFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.DISABLE);
     }
 
     @Override
@@ -61,7 +58,8 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         // attach ActionParameterDisabledFacet if disableNumMethod is found ...
 
-        val methodNameCandidates = processMethodContext.parameterSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::parameterSupportCandidates);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
index e90eea9..262437f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
@@ -23,15 +23,14 @@ import java.util.EnumSet;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.param.hide.ActionParameterHiddenFacet;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
@@ -39,13 +38,11 @@ import lombok.val;
  * Sets up {@link ActionParameterHiddenFacet}.
  */
 public class ActionParameterHiddenFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final String PREFIX = ProgrammingModelConstants.HIDE_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public ActionParameterHiddenFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.HIDE);
     }
 
     @Override
@@ -60,7 +57,8 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         // attach ActionParameterHiddenFacet if hideNumMethod is found ...
 
-        val methodNameCandidates = processMethodContext.parameterSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::parameterSupportCandidates);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
index eb2fe94..8325212 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
@@ -24,30 +24,27 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacet;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 
 import lombok.val;
 
 /**
  * Sets up {@link ActionParameterValidationFacet}. */
-public class ActionParameterValidationFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final String PREFIX = ProgrammingModelConstants.VALIDATE_PREFIX;
+public class ActionParameterValidationFacetViaMethodFactory
+extends MemberSupportFacetFactoryAbstract  {
 
     @Inject
     public ActionParameterValidationFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.VALIDATE);
     }
 
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
@@ -61,7 +58,8 @@ public class ActionParameterValidationFacetViaMethodFactory extends MethodPrefix
         // attach ActionParameterValidationFacet if validateNumMethod is found ...
         // in any case single-arg, either same as param-type or PPM style
 
-        val methodNameCandidates = processMethodContext.parameterSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::parameterSupportCandidates);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
index 4b2b371..b921b5a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
@@ -20,45 +20,37 @@ package org.apache.isis.core.metamodel.facets.properties.autocomplete.method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
 public class PropertyAutoCompleteFacetMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.AUTO_COMPLETE_PREFIX;
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public PropertyAutoCompleteFacetMethodFactory(final MetaModelContext mmc) {
         // to also support properties from mixins, need to not only include properties but also actions
-        super(mmc, FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.PROPERTIES_AND_ACTIONS, MemberSupportPrefix.AUTO_COMPLETE);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        attachPropertyAutoCompleteFacetIfChoicesMethodIsFound(processMethodContext);
-    }
-
-    private void attachPropertyAutoCompleteFacetIfChoicesMethodIsFound(
-            final ProcessMethodContext processMethodContext) {
-
         // optimization step, not strictly required
         if(!super.isPropertyOrMixinMain(processMethodContext)) {
             return;
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
index a196c8b..ef07005 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
@@ -20,43 +20,37 @@ package org.apache.isis.core.metamodel.facets.properties.choices.method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
-public class PropertyChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.CHOICES_PREFIX;
+public class PropertyChoicesFacetViaMethodFactory
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public PropertyChoicesFacetViaMethodFactory(final MetaModelContext mmc) {
-     // to also support properties from mixins, need to not only include properties but also actions
-        super(mmc, FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        // to also support properties from mixins, need to not only include properties but also actions
+        super(mmc, FeatureType.PROPERTIES_AND_ACTIONS, MemberSupportPrefix.CHOICES);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        attachPropertyChoicesFacetIfChoicesMethodIsFound(processMethodContext);
-    }
-
-    private void attachPropertyChoicesFacetIfChoicesMethodIsFound(final ProcessMethodContext processMethodContext) {
-
         // optimization step, not strictly required
         if(!super.isPropertyOrMixinMain(processMethodContext)) {
             return;
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
index cab1894..5ece0ad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
@@ -20,43 +20,37 @@ package org.apache.isis.core.metamodel.facets.properties.defaults.method;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
-public class PropertyDefaultFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = ProgrammingModelConstants.DEFAULT_PREFIX;
+public class PropertyDefaultFacetViaMethodFactory
+extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public PropertyDefaultFacetViaMethodFactory(final MetaModelContext mmc) {
      // to also support properties from mixins, need to not only include properties but also actions
-        super(mmc, FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.PROPERTIES_AND_ACTIONS, MemberSupportPrefix.DEFAULT);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        attachPropertyDefaultFacetIfDefaultMethodIsFound(processMethodContext);
-    }
-
-    private void attachPropertyDefaultFacetIfDefaultMethodIsFound(final ProcessMethodContext processMethodContext) {
-
         // optimization step, not strictly required
         if(!super.isPropertyOrMixinMain(processMethodContext)) {
             return;
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
index b8a1bdb..575dab9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
@@ -21,38 +21,31 @@ package org.apache.isis.core.metamodel.facets.properties.validating.method;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methods.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
 
 public class PropertyValidateFacetViaMethodFactory
-extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final String PREFIX = ProgrammingModelConstants.VALIDATE_PREFIX;
+extends MemberSupportFacetFactoryAbstract  {
 
     @Inject
     public PropertyValidateFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.PROPERTIES_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.PROPERTIES_ONLY, MemberSupportPrefix.VALIDATE);
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        attachValidateFacetIfValidateMethodIsFound(processMethodContext);
-    }
-
-    private void attachValidateFacetIfValidateMethodIsFound(final ProcessMethodContext processMethodContext) {
-
         val cls = processMethodContext.getCls();
         val getterMethod = processMethodContext.getMethod();
 
-        val methodNameCandidates = processMethodContext.memberSupportCandidates(PREFIX);
+        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
+                .flatMap(processMethodContext::memberSupportCandidates);
         val returnType = getterMethod.getReturnType();
 
         val validateMethod = MethodFinder.findMethod_returningText(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MemberSupportFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MemberSupportFacetFactoryAbstract.java
new file mode 100644
index 0000000..09b0d98
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MemberSupportFacetFactoryAbstract.java
@@ -0,0 +1,42 @@
+/*
+ *  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.methods;
+
+import org.apache.isis.commons.collections.ImmutableEnumSet;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+
+import lombok.NonNull;
+
+public abstract class MemberSupportFacetFactoryAbstract
+extends MethodPrefixBasedFacetFactoryAbstract {
+
+    protected final MemberSupportPrefix memberSupportPrefix;
+
+    protected MemberSupportFacetFactoryAbstract(
+            final @NonNull MetaModelContext mmc,
+            final @NonNull ImmutableEnumSet<FeatureType> featureTypes,
+            final @NonNull MemberSupportPrefix memberSupportPrefix) {
+        super(mmc, featureTypes, OrphanValidation.VALIDATE,
+                memberSupportPrefix.getMethodNamePrefixes());
+        this.memberSupportPrefix = memberSupportPrefix;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java
index 55ae272..877457c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java
@@ -20,7 +20,7 @@ package org.apache.isis.core.metamodel.methods;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
@@ -114,9 +114,9 @@ implements MethodPrefixBasedFacetFactory {
                             val explanation =
                                     objectAction.getParameterCount() > 0
                                             && noParamsOnly
-                                            && (ProgrammingModelConstants.HIDE_PREFIX.equals(prefix)
-                                                    || ProgrammingModelConstants.DISABLE_PREFIX.equals(prefix))
-                                            ? " (such methods must have no parameters, '"
+                                            && (MemberSupportPrefix.HIDE.getMethodNamePrefixes().contains(prefix)
+                                                    || MemberSupportPrefix.DISABLE.getMethodNamePrefixes().contains(prefix))
+                                            ? " (such methods must not have parameters, '"
                                                 + "isis.core.meta-model.validator.no-params-only"
                                                 + "' config property)"
                                             : "";
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index 02d20de..cd2839a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -22,7 +22,6 @@ import org.apache.isis.core.metamodel.facets.actions.action.ActionAnnotationShou
 import org.apache.isis.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.action.ActionOverloadingValidator;
 import org.apache.isis.core.metamodel.facets.actions.contributing.derived.ContributingFacetDerivedFromMixinFacetFactory;
-import org.apache.isis.core.metamodel.facets.actions.defaults.method.ActionDefaultsFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.actions.homepage.annotation.HomePageFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.derived.NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory;
@@ -61,11 +60,9 @@ import org.apache.isis.core.metamodel.facets.object.objectvalidprops.impl.Object
 import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.support.ObjectSupportFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.validating.validateobject.method.ValidateObjectFacetMethodFactory;
 import org.apache.isis.core.metamodel.facets.object.value.annotcfg.ValueFacetAnnotationOrConfigurationFactory;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.method.ActionParameterAutoCompleteFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory;
-import org.apache.isis.core.metamodel.facets.param.choices.method.ActionChoicesFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParameterChoicesFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.defaults.methodnum.ActionParameterDefaultsFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.disable.method.ActionParameterDisabledFacetViaMethodFactory;
@@ -212,10 +209,8 @@ extends ProgrammingModelAbstract {
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionParameterDisabledFacetViaMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionValidationFacetViaMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionParameterValidationFacetViaMethodFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionChoicesFacetViaMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionParameterChoicesFacetViaMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionParameterAutoCompleteFacetViaMethodFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionDefaultsFacetViaMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ActionParameterDefaultsFacetViaMethodFactory(mmc));
 
         // members in general
@@ -226,7 +221,6 @@ extends ProgrammingModelAbstract {
 
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new CallbackFacetFactory(mmc));
 
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ValidateObjectFacetMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ObjectValidPropertiesFacetImplFactory(mmc));
 
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new BookmarkPolicyFacetFallbackFactory(mmc));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 88d248c..25eac00 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -43,7 +43,6 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.commons.internal.reflection._ClassCache;
 import org.apache.isis.commons.internal.reflection._Reflect;
-import org.apache.isis.core.metamodel.commons.CanBeVoid;
 import org.apache.isis.core.metamodel.commons.MethodUtil;
 import org.apache.isis.core.metamodel.commons.ToString;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
@@ -510,34 +509,6 @@ implements HasMetaModelContext {
     // ////////////////////////////////////////////////////////////////////////////
 
     /**
-     *
-     * @param prefix
-     * @param returnType
-     * @param paramCount
-     * @param onRemoved - collecting parameter
-     */
-    private void findAndRemovePrefixedNonVoidMethods(
-            final String prefix,
-            final Class<?> returnType,
-            final int paramCount,
-            final Consumer<Method> onRemoved) {
-
-        findAndRemovePrefixedMethods(prefix, returnType, CanBeVoid.FALSE, paramCount, onRemoved);
-    }
-
-    private void findAndRemovePrefixedMethods(
-            final String prefix,
-            final Class<?> returnType,
-            final CanBeVoid canBeVoid,
-            final int paramCount,
-            final Consumer<Method> onMatch) {
-
-        val filter = MethodUtil.Predicates.prefixed(prefix, returnType, canBeVoid, paramCount);
-        methodRemover.removeMethods(filter, onMatch);
-
-    }
-
-    /**
      * In case this inspected type is a mixin, returns whether given method can be identified
      * as this mixin's main method.
      *
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index cd4f7b3..a5d5840 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -27,26 +27,19 @@ import java.util.Set;
 
 import org.jmock.Expectations;
 
-import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
-import org.apache.isis.core.metamodel.facets.actions.defaults.method.ActionDefaultsFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.actions.defaults.method.ActionDefaultsFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
 import org.apache.isis.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.method.ActionParameterAutoCompleteFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.method.ActionParameterAutoCompleteFacetViaMethodFactory;
-import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
-import org.apache.isis.core.metamodel.facets.param.choices.method.ActionChoicesFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.param.choices.method.ActionChoicesFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParameterChoicesFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParameterChoicesFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
@@ -169,119 +162,6 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateMethod));
     }
 
-    public void testInstallsParameterDefaultsMethodNoArgsFacetAndRemovesMethod() {
-        val facetFactory = new ActionDefaultsFacetViaMethodFactory(metaModelContext);
-
-        // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(final int x, final Long y) {
-            }
-
-            @SuppressWarnings("unused")
-            public Object[] defaultSomeAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, Long.class });
-        final Method defaultMethod = findMethod(Customer.class, "defaultSomeAction", new Class[] {});
-
-        facetFactory.process(ProcessMethodContext
-                .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(ActionDefaultsFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof ActionDefaultsFacetViaMethod);
-        final ActionDefaultsFacetViaMethod actionDefaultFacetViaMethod = (ActionDefaultsFacetViaMethod) facet;
-        assertEquals(defaultMethod, actionDefaultFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(defaultMethod));
-    }
-
-    public void testInstallsParameterDefaultsMethodSomeArgsIsIgnored() {
-        val facetFactory = new ActionDefaultsFacetViaMethodFactory(metaModelContext);
-
-        // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(final int x, final Long y) {
-            }
-
-            @SuppressWarnings("unused")
-            public Object[] defaultSomeAction(final int x, final Long y) {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, Long.class });
-
-        facetFactory.process(ProcessMethodContext
-                .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(ActionDefaultsFacet.class);
-        assertNull(facet);
-    }
-
-    public void testInstallsParameterChoicesMethodNoArgsFacetAndRemovesMethod() {
-        val facetFactory = new ActionChoicesFacetViaMethodFactory(metaModelContext);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(final int x, final Long y) {
-            }
-
-            @SuppressWarnings("unused")
-            public Object[] choicesSomeAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, Long.class });
-        final Method choicesMethod = findMethod(Customer.class, "choicesSomeAction", new Class[] {});
-        // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        facetFactory.process(ProcessMethodContext
-                .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(ActionChoicesFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof ActionChoicesFacetViaMethod);
-        final ActionChoicesFacetViaMethod actionChoicesFacetViaMethod = (ActionChoicesFacetViaMethod) facet;
-        assertEquals(choicesMethod, actionChoicesFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(choicesMethod));
-    }
-
-    public void testInstallsParameterChoicesMethodSomeArgsIsIgnored() {
-        val facetFactory = new ActionChoicesFacetViaMethodFactory(metaModelContext);
-
-        // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(final int x, final Long y) {
-            }
-
-            @SuppressWarnings("unused")
-            public Object[] choicesSomeAction(final int x, final Long y) {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, Long.class });
-
-        facetFactory.process(ProcessMethodContext
-                .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(ActionChoicesFacet.class);
-        assertNull(facet);
-    }
-
-
-
     public void testInstallsParameterDefaultsMethodAndRemovesMethod() {
         val facetFactory = new ActionParameterDefaultsFacetViaMethodFactory(metaModelContext);
 
@@ -431,100 +311,5 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(autoComplete0Method));
     }
 
-    public void testBothChoicesMethodCausesException() {
-
-        val facetFactory = new ActionChoicesFacetViaMethodFactory(metaModelContext);
-
-        //        mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        final ActionParameterChoicesFacetViaMethodFactory facetFactoryForParams =
-                new ActionParameterChoicesFacetViaMethodFactory(metaModelContext);
-
-        //        mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(final int x, final long y) {
-            }
-
-            @SuppressWarnings("unused")
-            public int[] choices0SomeAction() {
-                return new int[0];
-            }
-
-            @SuppressWarnings("unused")
-            public long[] choices1SomeAction() {
-                return new long[0];
-            }
-
-            @SuppressWarnings("unused")
-            public Object[][] choicesSomeAction() {
-                return null;
-            }
-        }
-
-        final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class });
-        final FacetedMethod facetHolderWithParms = FacetedMethod
-                .createForAction(metaModelContext, Customer.class, actionMethod);
-
-        final ProcessMethodContext processMethodContext = ProcessMethodContext
-                .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetHolderWithParms);
-        facetFactory.process(processMethodContext);
-        try {
-            facetFactoryForParams.process(processMethodContext);
-            fail("exception expected");
-        } catch (final MetaModelException expected) {
-            // ignore
-        }
-    }
-
-    public void testBothDefaultMethodCausesException() {
-        val facetFactory = new ActionDefaultsFacetViaMethodFactory(metaModelContext);
-
-        // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        final ActionParameterDefaultsFacetViaMethodFactory facetFactoryForParams =
-                new ActionParameterDefaultsFacetViaMethodFactory(metaModelContext);
-
-        // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
-        allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(final int x, final long y) {
-            }
-
-            @SuppressWarnings("unused")
-            public int default0SomeAction() {
-                return 0;
-            }
-
-            @SuppressWarnings("unused")
-            public long default1SomeAction() {
-                return 0;
-            }
-
-            @SuppressWarnings("unused")
-            public Object[] defaultSomeAction() {
-                return null;
-            }
-        }
-
-        final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class });
-        final FacetedMethod facetHolderWithParms = FacetedMethod
-                .createForAction(metaModelContext, Customer.class, actionMethod);
-
-        final ProcessMethodContext processMethodContext = ProcessMethodContext
-                .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetHolderWithParms);
-        facetFactory.process(processMethodContext);
-        try {
-            facetFactoryForParams.process(processMethodContext);
-            fail("exception expected");
-        } catch (final MetaModelException expected) {
-
-        }
-    }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java
deleted file mode 100644
index bedea7c..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java
+++ /dev/null
@@ -1,65 +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.object.validating.validateobject;
-
-import java.lang.reflect.Method;
-
-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.object.validating.validateobject.method.ValidateObjectFacetMethod;
-import org.apache.isis.core.metamodel.facets.object.validating.validateobject.method.ValidateObjectFacetMethodFactory;
-
-public class ObjectValidMethodFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private ValidateObjectFacetMethodFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        facetFactory = new ValidateObjectFacetMethodFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testValidateMethodPickedUpAndMethodRemoved() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public String validate() {
-                return null;
-            }
-        }
-        final Method validateMethod = findMethod(Customer.class, "validate");
-
-        final ProcessClassContext processClassContext = ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetHolder);
-        facetFactory.process(processClassContext);
-
-        final Facet facet = facetHolder.getFacet(ValidateObjectFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof ValidateObjectFacetMethod);
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateMethod));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index 2a4c41a..345ee36 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -67,7 +67,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
     public void verifyProgrammingModelNumberOfFactories() {
-        assertEquals(108, programmingModel.streamFactories().count());
+        assertEquals(105, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this class