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

[isis] branch master updated (5a3a1c6 -> c975099)

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

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


    from 5a3a1c6  ISIS-2774: just renaming params (got the semantic wrong in prev. commit)
     new c26d704  ISIS-2774: minor cleanup
     new c975099  ISIS-2774: more rigorous member prefix declarations (use enums)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/isis/commons/collections/Can.java   |  14 ++
 .../progmodel/ProgrammingModelConstants.java       |  52 ++---
 .../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 +-
 .../MemberSupportFacetFactoryAbstract.java}        |  28 ++-
 .../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, 153 insertions(+), 1131 deletions(-)
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethod.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacet.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ValidateObjectFacetAbstract.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethod.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/{facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java => methods/MemberSupportFacetFactoryAbstract.java} (55%)
 delete mode 100644 core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java

[isis] 01/02: ISIS-2774: minor cleanup

Posted by ah...@apache.org.
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 c26d7044de34aac3bbf9e0a8d5e9c9d007f93e5c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 7 11:01:38 2021 +0200

    ISIS-2774: minor cleanup
---
 .../progmodel/ProgrammingModelConstants.java       | 28 ++++++++--------------
 1 file changed, 10 insertions(+), 18 deletions(-)

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 f917bd3..e5e83c8 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
@@ -172,7 +172,7 @@ public final class ProgrammingModelConstants {
         private final Can<String> methodNames;
     }
 
-    // -- MEMBER SUPPORT
+    // -- MEMBER SUPPORT PREFIXES
 
     public static final String DEFAULT_PREFIX = "default";
     public static final String CHOICES_PREFIX = "choices";
@@ -200,27 +200,19 @@ public final class ProgrammingModelConstants {
         final Can<Class<? extends Annotation>> prohibits;
     }
 
-    // -- METHOD NAMING CONVENTIONS
-
-    @FunctionalInterface
-    public static interface SupportingMethodNameProviderForPropertyAndCollection {
-        /** automatically deals with properties getters and actions */
-        @Nullable String getMemberSupportingMethodName(Member member, String prefix, boolean isMixin);
-    }
-
     // -- SUPPORTING METHOD NAMING CONVENTION
 
     public static enum ActionSupportNaming {
         /** eg. hideAct() */
         PREFIXED_ACTION_NAME {
-            @Override
+            @Override @Nullable
             String nameFor(final Method actionMethod, final String prefix, final boolean isMixin) {
                 return prefix + _Strings.capitalize(actionMethod.getName());
             }
         },
         /** eg. hide() */
         PREFIX_ONLY {
-            @Override
+            @Override @Nullable
             String nameFor(final Method actionMethod, final String prefix, final boolean isMixin) {
                 return isMixin
                         // prefix-only notation is restricted to mixins
@@ -228,7 +220,7 @@ public final class ProgrammingModelConstants {
                         : null;
             }
         };
-        abstract String nameFor(Method actionMethod, String prefix, boolean isMixin);
+        abstract @Nullable String nameFor(Method actionMethod, String prefix, boolean isMixin);
         public static Can<String> namesFor(final Method actionMethod, final String prefix, final boolean isMixin) {
             return Stream.of(ActionSupportNaming.values())
                     .map(naming->naming.nameFor(actionMethod, prefix, isMixin))
@@ -239,14 +231,14 @@ public final class ProgrammingModelConstants {
     public static enum ParameterSupportNaming {
         /** eg. hide2Act(..) */
         PREFIX_PARAM_INDEX_ACTION_NAME {
-            @Override
+            @Override @Nullable
             String nameFor(final Method actionMethod, final String prefix, final boolean isMixin, final int paramNum) {
                 return prefix + paramNum + _Strings.capitalize(actionMethod.getName());
             }
         },
         /** eg. hideEmail() .. where email is the referenced parameter's name */
         PREFIXED_PARAM_NAME {
-            @Override
+            @Override @Nullable
             String nameFor(final Method actionMethod, final String prefix, final boolean isMixin, final int paramNum) {
                 return isMixin
                         // no-action-name-reference notation is restricted to mixins
@@ -254,7 +246,7 @@ public final class ProgrammingModelConstants {
                         : null;
             }
         };
-        abstract String nameFor(Method actionMethod, String prefix, boolean isMixin, int paramNum);
+        abstract @Nullable String nameFor(Method actionMethod, String prefix, boolean isMixin, int paramNum);
         public static Can<IntFunction<String>> namesFor(final Method actionMethod, final String prefix, final boolean isMixin) {
             return Stream.of(ParameterSupportNaming.values())
                     .<IntFunction<String>>map(naming->(paramNum->naming.nameFor(actionMethod, prefix, isMixin, paramNum)))
@@ -266,14 +258,14 @@ public final class ProgrammingModelConstants {
     public static enum MemberSupportNaming {
         /** eg. hideProp() */
         PREFIXED_MEMBER_NAME {
-            @Override
+            @Override @Nullable
             String nameFor(final Member member, final String prefix, final boolean isMixin) {
                 return prefix + getCapitalizedMemberName(member);
             }
         },
         /** eg. hide() */
         PREFIX_ONLY {
-            @Override
+            @Override @Nullable
             String nameFor(final Member member, final String prefix, final boolean isMixin) {
                 return isMixin
                         // prefix-only notation is restricted to mixins
@@ -281,7 +273,7 @@ public final class ProgrammingModelConstants {
                         : null;
             }
         };
-        abstract String nameFor(Member member, String prefix, boolean isMixin);
+        abstract @Nullable String nameFor(Member member, String prefix, boolean isMixin);
         public static Can<String> namesFor(final Member member, final String prefix, final boolean isMixin) {
             return Stream.of(MemberSupportNaming.values())
                     .map(naming->naming.nameFor(member, prefix, isMixin))

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

Posted by ah...@apache.org.
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