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 21:07:15 UTC

[isis] branch master updated: ISIS-2774: polishing all MemberSupportFacetFactories

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

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


The following commit(s) were added to refs/heads/master by this push:
     new cae08e9  ISIS-2774: polishing all MemberSupportFacetFactories
cae08e9 is described below

commit cae08e9e29b1ee70031229128337ec491e092af8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 7 23:07:06 2021 +0200

    ISIS-2774: polishing all MemberSupportFacetFactories
    
    also removes config option that allows disableXxx/hideXxx to declare all
    params when supporting an action
    (marked deprecated)
---
 .../isis/commons/collections/ImmutableEnumSet.java | 12 ++++
 .../apache/isis/core/config/IsisConfiguration.java |  6 +-
 .../progmodel/ProgrammingModelConstants.java       |  7 +-
 .../isis/core/metamodel/facets/ActionSupport.java  |  4 +-
 .../metamodel/facets/FacetFactoryAbstract.java     |  2 +-
 .../ActionValidationFacetViaMethodFactory.java     | 37 ++++++----
 .../DescribedAsFacetForMemberViaMethodFactory.java | 53 +++++---------
 .../method/DisableForContextFacetViaMethod.java    | 10 +--
 .../DisableForContextFacetViaMethodFactory.java    | 81 +++++-----------------
 .../HideForContextFacetViaMethodFactory.java       | 74 +++++---------------
 .../NamedFacetForMemberViaMethodFactory.java       | 53 +++++---------
 .../support/MemberSupportFacetFactoryAbstract.java | 58 +++++++---------
 ...ActionParameterSupportFacetFactoryAbstract.java |  2 +-
 .../PropertyAutoCompleteFacetMethodFactory.java    | 60 ++++++----------
 .../PropertyChoicesFacetViaMethodFactory.java      | 59 ++++++----------
 .../PropertyDefaultFacetViaMethodFactory.java      | 56 +++++----------
 .../method/PropertyValidateFacetViaMethod.java     |  4 +-
 .../PropertyValidateFacetViaMethodFactory.java     | 50 +++++--------
 .../MethodPrefixBasedFacetFactoryAbstract.java     | 15 ++--
 ...nnotationFacetFactoryTest_ActionInvocation.java |  4 +-
 20 files changed, 240 insertions(+), 407 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java b/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java
index 745c8e3..7e7a360 100644
--- a/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java
+++ b/commons/src/main/java/org/apache/isis/commons/collections/ImmutableEnumSet.java
@@ -22,6 +22,8 @@ import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.stream.Stream;
 
+import lombok.val;
+
 /**
  * Immutable variant of {@link EnumSet}
  *
@@ -91,4 +93,14 @@ implements Iterable<E>, java.io.Serializable {
         return delegate.isEmpty();
     }
 
+    public ImmutableEnumSet<E> add(final E entry) {
+        if(contains(entry)) {
+            return this;
+        }
+        val newEnumSet = delegate.clone();
+        newEnumSet.add(entry);
+        return from(newEnumSet);
+    }
+
+
 }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index be8d488..27ee1a5 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -68,8 +68,6 @@ import org.apache.isis.applib.services.userreg.UserRegistrationService;
 import org.apache.isis.applib.services.userui.UserMenu;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.core.config.IsisConfiguration.Core;
-import org.apache.isis.core.config.IsisConfiguration.Viewer;
 import org.apache.isis.core.config.metamodel.facets.DefaultViewConfiguration;
 import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
 import org.apache.isis.core.config.metamodel.facets.PublishingPolicies.ActionPublishingPolicy;
@@ -1413,8 +1411,10 @@ public class IsisConfiguration {
                  *     relate to the N-th parameter, and allow up to N-1 parameters to be passed in (allowing the Nth
                  *     parameter to be dynamically hidden or disabled).
                  * </p>
+                 * @deprecated this option is ignored by the framework, behavior is now fixated to noParamsOnly = true
                  */
-                private boolean noParamsOnly = false;
+                @Deprecated(forRemoval = true, since = "2.0.0-M7")
+                private boolean noParamsOnly = true;
 
                 /**
                  * Whether to validate that any actions that accept action parameters have either a corresponding
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 914a632..7233fd3 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
@@ -42,6 +42,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 
 import lombok.Getter;
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
@@ -140,7 +141,7 @@ public final class ProgrammingModelConstants {
         }
         private final Can<Class<?>> returnTypes;
 
-        public static Can<Class<?>> nonScalar(final Class<?> elementReturnType) {
+        public static Can<Class<?>> nonScalar(final @NonNull Class<?> elementReturnType) {
             return Can.<Class<?>>of(
                 Can.class,
                 Collection.class,
@@ -196,10 +197,10 @@ public final class ProgrammingModelConstants {
         MemberSupportPrefix(
                 final ReturnType parameterSearchReturnType,
                 final String ...methodNamePrefixes) {
-            this.parameterSearchReturnType = parameterSearchReturnType;
+            this.supportMethodReturnType = parameterSearchReturnType;
             this.methodNamePrefixes = Can.of(methodNamePrefixes);
         }
-        private final ReturnType parameterSearchReturnType;
+        private final ReturnType supportMethodReturnType;
         private final Can<String> methodNamePrefixes;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
index 0ad990f..64f02ad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
@@ -211,11 +211,11 @@ public final class ActionSupport {
 
         val paramTypesConsidered = paramsConsidered<paramTypes.length
                 ? Arrays.copyOf(paramTypes, paramsConsidered)
-                        : paramTypes;
+                : paramTypes;
 
         val withAdditional = additionalParamType!=null
                 ? _Arrays.combine(paramTypesConsidered, additionalParamType)
-                        : paramTypesConsidered;
+                : paramTypesConsidered;
 
         return withAdditional;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
index 8c7d0bd..e4d5090 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
@@ -85,7 +85,7 @@ implements FacetFactory, HasMetaModelContext {
 
     // -- METHOD UTILITITES
 
-    protected static final Class<?> NO_RETURN = null;
+    protected static final Class<?> ANY_RETURN = null;
     protected static final Class<?>[] NO_ARG = new Class<?>[0];
     protected static final Class<?>[] STRING_ARG = new Class<?>[] {String.class};
 
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 5ef9662..6d32713 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
@@ -22,12 +22,13 @@ import java.util.EnumSet;
 
 import javax.inject.Inject;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnType;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.ActionSupport.ActionSupportingMethodSearchResult;
+import org.apache.isis.core.metamodel.facets.ActionSupport;
 import org.apache.isis.core.metamodel.facets.ActionSupport.SearchAlgorithm;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.param.validate.method.ActionParameterValidationFacetViaMethod;
 
@@ -41,20 +42,30 @@ extends MemberSupportFacetFactoryAbstract {
 
     @Inject
     public ActionValidationFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.VALIDATE, searchOptions->
-                searchOptions
-                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.ALL_PARAM_TYPES)));
+        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.VALIDATE);
     }
 
     @Override
-    protected void onSearchResult(
-            final FacetedMethod facetHolder,
-            final ActionSupportingMethodSearchResult searchResult) {
-        val validateMethod = searchResult.getSupportingMethod();
-        val ppmFactory = searchResult.getPpmFactory();
-        addFacet(
-                new ActionValidationFacetViaMethod(
-                        validateMethod, ppmFactory, facetHolder));
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
+
+        val searchRequest = ActionSupport.ActionSupportingMethodSearchRequest.builder()
+                .processMethodContext(processMethodContext)
+                .returnType(ReturnType.TEXT)
+                .methodNames(methodNameCandidates)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.ALL_PARAM_TYPES))
+                .build();
+
+        ActionSupport.findActionSupportingMethods(searchRequest, searchResult -> {
+            val validateMethod = searchResult.getSupportingMethod();
+            processMethodContext.removeMethod(validateMethod);
+            val ppmFactory = searchResult.getPpmFactory();
+            addFacet(
+                    new ActionValidationFacetViaMethod(
+                            validateMethod, ppmFactory, processMethodContext.getFacetHolder()));
+        });
+
     }
 
 }
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 364eda8..57fd567 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,17 +20,14 @@ 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.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.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 
-import lombok.val;
-
 public class DescribedAsFacetForMemberViaMethodFactory
 extends MemberSupportFacetFactoryAbstract {
 
@@ -40,37 +37,23 @@ extends MemberSupportFacetFactoryAbstract {
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val cls = processMethodContext.getCls();
-        //val actionOrGetter = processMethodContext.getMethod();
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
-
-        val describedMethod = MethodFinder.findMethod_returningText(
-                MethodFinderOptions
-                .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                cls,
-                methodNameCandidates,
-                NO_ARG)
-                .findFirst()
-                .orElse(null);
-        if (describedMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(describedMethod);
-
-        addFacet(
-                new DescribedAsFacetForMemberViaMethod(
-                        describedMethod,
-                        processMethodContext.getFacetHolder()));
-    }
-
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
-
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
+
+        MethodFinder
+        .findMethod_returningText(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            NO_ARG)
+        .peek(processMethodContext::removeMethod)
+        .forEach(describedMethod->{
+            addFacet(
+                    new DescribedAsFacetForMemberViaMethod(
+                            describedMethod, processMethodContext.getFacetHolder()));
+        });
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
index aa10822..47b24ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
@@ -23,7 +23,6 @@ import java.util.function.BiConsumer;
 
 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;
@@ -40,18 +39,15 @@ extends DisableForContextFacetAbstract
 implements ImperativeFacet {
 
     @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
-    private final TranslationService translationService;
     private final TranslationContext translationContext;
 
     public DisableForContextFacetViaMethod(
             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;
+        this.translationContext =
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
     }
 
     @Override
@@ -75,7 +71,7 @@ implements ImperativeFacet {
         }
         if(returnValue instanceof TranslatableString) {
             final TranslatableString ts = (TranslatableString) returnValue;
-            return ts.translate(translationService, translationContext);
+            return ts.translate(getTranslationService(), translationContext);
         }
         return null;
     }
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 a89e4c8..648b887 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
@@ -18,22 +18,16 @@
  */
 package org.apache.isis.core.metamodel.facets.members.disabled.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.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.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 
-import lombok.val;
-
 public class DisableForContextFacetViaMethodFactory
 extends MemberSupportFacetFactoryAbstract  {
 
@@ -42,61 +36,24 @@ extends MemberSupportFacetFactoryAbstract  {
         super(mmc, FeatureType.MEMBERS, MemberSupportPrefix.DISABLE);
     }
 
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val actionOrGetter = processMethodContext.getMethod();
-
-        val cls = processMethodContext.getCls();
-
-        Method disableMethod = null;
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
-
-        boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
-        boolean searchExactMatch = !noParamsOnly;
-        if(searchExactMatch) {
-            // search for exact match
-            disableMethod = MethodFinder.findMethod_returningText(
-                    MethodFinderOptions
-                    .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                    cls,
-                    methodNameCandidates,
-                    actionOrGetter.getParameterTypes())
-                    .findFirst()
-                    .orElse(null);
-        }
-        if (disableMethod == null) {
-            // search for no-arg version
-            disableMethod = MethodFinder.findMethod_returningText(
-                    MethodFinderOptions
-                    .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                    cls,
-                    methodNameCandidates,
-                    NO_ARG)
-                    .findFirst()
-                    .orElse(null);
-        }
-        if (disableMethod == null) {
-            return;
-        }
-
-        processMethodContext.removeMethod(disableMethod);
-
-        val facetHolder = processMethodContext.getFacetHolder();
-        val translationService = getTranslationService();
-        // sadness: same logic as in I18nFacetFactory
-        val translationContext = TranslationContext
-                .forTranslationContextHolder(facetHolder.getFeatureIdentifier());
-        addFacet(
-                new DisableForContextFacetViaMethod(
-                        disableMethod, translationService, translationContext, facetHolder));
-    }
-
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
+     @Override
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
+
+         MethodFinder
+         .findMethod_returningText(
+             MethodFinderOptions
+             .memberSupport(processMethodContext.getIntrospectionPolicy()),
+             processMethodContext.getCls(),
+             methodNameCandidates,
+             NO_ARG)
+         .peek(processMethodContext::removeMethod)
+         .forEach(disableMethod->{
+             addFacet(
+                     new DisableForContextFacetViaMethod(
+                             disableMethod, processMethodContext.getFacetHolder()));
+         });
 
     }
 
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 a445381..a9e5b40 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
@@ -18,23 +18,16 @@
  */
 package org.apache.isis.core.metamodel.facets.members.hidden.method;
 
-import java.lang.reflect.Method;
-
 import javax.inject.Inject;
 
+import org.apache.isis.commons.collections.Can;
 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.facets.ActionSupport.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 
-import lombok.val;
-
 public class HideForContextFacetViaMethodFactory
 extends MemberSupportFacetFactoryAbstract {
 
@@ -44,53 +37,24 @@ extends MemberSupportFacetFactoryAbstract {
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        final Method actionOrGetter = processMethodContext.getMethod();
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
-
-        val cls = processMethodContext.getCls();
-        Method hideMethod = MethodFinder.findMethod(
-                MethodFinderOptions
-                .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                cls,
-                methodNameCandidates,
-                boolean.class,
-                NO_ARG)
-                .findFirst()
-                .orElse(null);
-        if (hideMethod == null) {
-
-            boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
-            boolean searchExactMatch = !noParamsOnly;
-            if(searchExactMatch) {
-                hideMethod = MethodFinder.findMethod(
-                        MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        cls,
-                        methodNameCandidates,
-                        boolean.class,
-                        actionOrGetter.getParameterTypes())
-                        .findFirst()
-                        .orElse(null);
-            }
-        }
-
-        if (hideMethod == null) {
-            return;
-        }
-
-        processMethodContext.removeMethod(hideMethod);
-
-        final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new HideForContextFacetViaMethod(hideMethod, facetedMethod));
-    }
-
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
+
+        MethodFinder
+        .findMethod(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            boolean.class,
+            NO_ARG)
+        .peek(processMethodContext::removeMethod)
+        .forEach(hideMethod->{
+            addFacet(
+                    new HideForContextFacetViaMethod(
+                            hideMethod, processMethodContext.getFacetHolder()));
+        });
 
     }
 
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 a3d2c93..a9b70dd 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,18 +20,14 @@ 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.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.facets.ActionSupport.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 
-import lombok.val;
-
 public class NamedFacetForMemberViaMethodFactory
 extends MemberSupportFacetFactoryAbstract {
 
@@ -41,37 +37,24 @@ extends MemberSupportFacetFactoryAbstract {
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val cls = processMethodContext.getCls();
-        //val actionOrGetter = processMethodContext.getMethod();
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
-
-        val namedMethod = MethodFinder.findMethod_returningText(
-                MethodFinderOptions
-                .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                cls,
-                methodNameCandidates,
-                NO_ARG)
-                .findFirst()
-                .orElse(null);
-        if (namedMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(namedMethod);
-
-        FacetUtil.addFacet(
-                new NamedFacetForMemberViaMethod(
-                        namedMethod,
-                        processMethodContext.getFacetHolder()));
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
+
+        MethodFinder
+        .findMethod_returningText(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            NO_ARG)
+        .peek(processMethodContext::removeMethod)
+        .forEach(namedMethod->{
+            addFacet(
+                    new NamedFacetForMemberViaMethod(
+                            namedMethod, processMethodContext.getFacetHolder()));
+        });
     }
 
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
-
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/support/MemberSupportFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/support/MemberSupportFacetFactoryAbstract.java
index 9cabbfd..c022df7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/support/MemberSupportFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/support/MemberSupportFacetFactoryAbstract.java
@@ -18,16 +18,11 @@
  */
 package org.apache.isis.core.metamodel.facets.members.support;
 
-import java.util.function.UnaryOperator;
-
+import org.apache.isis.commons.collections.Can;
 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 org.apache.isis.core.metamodel.facets.ActionSupport;
-import org.apache.isis.core.metamodel.facets.ActionSupport.ActionSupportingMethodSearchRequest.ActionSupportingMethodSearchRequestBuilder;
-import org.apache.isis.core.metamodel.facets.ActionSupport.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 
 import lombok.NonNull;
 import lombok.val;
@@ -35,48 +30,47 @@ import lombok.val;
 public abstract class MemberSupportFacetFactoryAbstract
 extends MemberAndPropertySupportFacetFactoryAbstract {
 
-    private final UnaryOperator<ActionSupportingMethodSearchRequestBuilder>
-        searchRefiner;
+    private final boolean mixinSupportExplicitlyAdded;
 
     protected MemberSupportFacetFactoryAbstract(
             final @NonNull MetaModelContext mmc,
             final @NonNull ImmutableEnumSet<FeatureType> featureTypes,
             final @NonNull MemberSupportPrefix memberSupportPrefix) {
-        this(mmc, featureTypes, memberSupportPrefix, UnaryOperator.identity());
+        super(mmc, addMixinSupport(featureTypes), memberSupportPrefix);
+        this.mixinSupportExplicitlyAdded = !featureTypes.contains(FeatureType.ACTION);
     }
 
-    protected MemberSupportFacetFactoryAbstract(
-            final @NonNull MetaModelContext mmc,
-            final @NonNull ImmutableEnumSet<FeatureType> featureTypes,
-            final @NonNull MemberSupportPrefix memberSupportPrefix,
-            final @NonNull UnaryOperator<ActionSupportingMethodSearchRequestBuilder> searchRefiner) {
-        super(mmc, featureTypes, memberSupportPrefix);
-        this.searchRefiner = searchRefiner;
+    private static ImmutableEnumSet<FeatureType> addMixinSupport(
+            final ImmutableEnumSet<FeatureType> featureTypes) {
+        return featureTypes.add(FeatureType.ACTION);
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
+    public final void process(final ProcessMethodContext processMethodContext) {
+
+        // optimization step, not strictly required
+        if(mixinSupportExplicitlyAdded
+                && !processMethodContext.isMixinMain()) {
+            // stop processing if it is not an allowed property or collection
+            val isProp = getFeatureTypes().contains(FeatureType.PROPERTY)
+                    && processMethodContext.getFeatureType().isProperty();
+            val isColl = getFeatureTypes().contains(FeatureType.COLLECTION)
+                    && processMethodContext.getFeatureType().isCollection();
+            if(!(isProp
+                    || isColl)) {
+                return; // skip
+            }
+        }
 
         val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
                 .flatMap(processMethodContext::memberSupportCandidates);
 
-        val searchRequest = searchRefiner
-                .apply(
-                        ActionSupport.ActionSupportingMethodSearchRequest.builder()
-                        .processMethodContext(processMethodContext)
-                        .methodNames(methodNameCandidates)
-                        .returnType(memberSupportPrefix.getParameterSearchReturnType()))
-                .build();
-
-        ActionSupport.findActionSupportingMethods(searchRequest, searchResult -> {
-            processMethodContext.removeMethod(searchResult.getSupportingMethod());
-            onSearchResult(processMethodContext.getFacetHolder(), searchResult);
-        });
+        search(processMethodContext, methodNameCandidates);
 
     }
 
-    protected abstract void onSearchResult(
-            FacetedMethod facetHolder,
-            ActionSupportingMethodSearchResult searchResult);
+    protected abstract void search(
+            ProcessMethodContext processMethodContext,
+            Can<String> methodNameCandidates);
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/support/ActionParameterSupportFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/support/ActionParameterSupportFacetFactoryAbstract.java
index 2aa099b..1680774 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/support/ActionParameterSupportFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/support/ActionParameterSupportFacetFactoryAbstract.java
@@ -74,7 +74,7 @@ extends MemberAndPropertySupportFacetFactoryAbstract {
                         .processMethodContext(processMethodContext)
                         .paramIndexToMethodNameProviders(methodNameCandidates)
                         .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
-                        .returnType(memberSupportPrefix.getParameterSearchReturnType()))
+                        .returnType(memberSupportPrefix.getSupportMethodReturnType()))
                 .build();
 
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
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 79604e5..db8d36f 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,13 +20,10 @@ 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.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.facets.ActionSupport.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
@@ -38,48 +35,33 @@ 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, MemberSupportPrefix.AUTO_COMPLETE);
+        super(mmc, FeatureType.PROPERTIES_ONLY, MemberSupportPrefix.AUTO_COMPLETE);
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
 
-        // optimization step, not strictly required
-        if(!super.isPropertyOrMixinMain(processMethodContext)) {
-            return;
-        }
+        MethodFinder
+        .findMethod(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            ANY_RETURN,
+            STRING_ARG)
+        .peek(processMethodContext::removeMethod)
+        .forEach(autoCompleteMethod->{
 
-        val getterOrMixinMain = processMethodContext.getMethod();
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
+            val getterOrMixinMain = processMethodContext.getMethod();
+            val returnType = getterOrMixinMain.getReturnType();
 
-        val cls = processMethodContext.getCls();
-        val returnType = getterOrMixinMain.getReturnType();
-        val autoCompleteMethod = MethodFinder
-                .findMethod(
-                        MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        cls,
-                        methodNameCandidates,
-                        NO_RETURN,
-                        STRING_ARG)
-                .findFirst()
-                .orElse(null);
-        if (autoCompleteMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(autoCompleteMethod);
+            addFacet(
+                    new PropertyAutoCompleteFacetMethod(
+                            autoCompleteMethod, returnType, processMethodContext.getFacetHolder()));
+        });
 
-        final FacetHolder property = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new PropertyAutoCompleteFacetMethod(autoCompleteMethod, returnType, property));
     }
 
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
-
-    }
-
-
 }
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 af8ed60..299f2df 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,13 +20,10 @@ 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.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.facets.ActionSupport.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
@@ -38,46 +35,32 @@ 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, MemberSupportPrefix.CHOICES);
+        super(mmc, FeatureType.PROPERTIES_ONLY, MemberSupportPrefix.CHOICES);
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
 
-        // optimization step, not strictly required
-        if(!super.isPropertyOrMixinMain(processMethodContext)) {
-            return;
-        }
+        MethodFinder
+        .findMethod(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            ANY_RETURN,
+            NO_ARG)
+        .peek(processMethodContext::removeMethod)
+        .forEach(choicesMethod->{
 
-        val getterOrMixinMain = processMethodContext.getMethod();
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
+            val getterOrMixinMain = processMethodContext.getMethod();
+            val returnType = getterOrMixinMain.getReturnType();
 
-        val cls = processMethodContext.getCls();
-        val returnType = getterOrMixinMain.getReturnType();
-        val choicesMethod = MethodFinder
-                .findMethod(
-                        MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                    cls,
-                    methodNameCandidates,
-                    NO_RETURN,
-                    NO_ARG)
-                .findFirst()
-                .orElse(null);
-        if (choicesMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(choicesMethod);
-
-        final FacetHolder property = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new PropertyChoicesFacetViaMethod(choicesMethod, returnType, property));
-    }
-
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
+            addFacet(
+                    new PropertyChoicesFacetViaMethod(
+                            choicesMethod, returnType, processMethodContext.getFacetHolder()));
+        });
 
     }
 
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 30d4b98..25ae13f 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,13 +20,10 @@ 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.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.facets.ActionSupport.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
@@ -38,46 +35,31 @@ 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, MemberSupportPrefix.DEFAULT);
+        super(mmc, FeatureType.PROPERTIES_ONLY, MemberSupportPrefix.DEFAULT);
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        // optimization step, not strictly required
-        if(!super.isPropertyOrMixinMain(processMethodContext)) {
-            return;
-        }
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
-
-        val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
-        val method = MethodFinder
-                .findMethod(
-                    MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                    cls,
-                    methodNameCandidates,
-                    returnType,
-                    NO_ARG)
-                .findFirst()
-                .orElse(null);
-        if (method == null) {
-            return;
-        }
-        processMethodContext.removeMethod(method);
 
-        final FacetHolder property = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new PropertyDefaultFacetViaMethod(method, property));
-    }
-
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
+        MethodFinder
+        .findMethod(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            returnType,
+            NO_ARG)
+        .peek(processMethodContext::removeMethod)
+        .forEach(defaultMethod->{
+            addFacet(
+                    new PropertyDefaultFacetViaMethod(
+                            defaultMethod, processMethodContext.getFacetHolder()));
+        });
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
index 197e8c1..68ca9f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
@@ -37,11 +37,11 @@ public class PropertyValidateFacetViaMethod extends PropertyValidateFacetAbstrac
 
     public PropertyValidateFacetViaMethod(
             final Method method,
-    		final TranslationContext translationContext,
     		final FacetHolder holder) {
         super(holder);
         this.method = method;
-        this.translationContext = translationContext;
+        this.translationContext =
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
     }
 
     /**
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 d0ec64a..ebe907a 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
@@ -20,12 +20,10 @@ 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.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.ActionSupportingMethodSearchResult;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
@@ -41,41 +39,27 @@ extends MemberSupportFacetFactoryAbstract  {
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
+    protected void search(
+            final ProcessMethodContext processMethodContext,
+            final Can<String> methodNameCandidates) {
 
-        val cls = processMethodContext.getCls();
         val getterMethod = processMethodContext.getMethod();
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::memberSupportCandidates);
         val returnType = getterMethod.getReturnType();
 
-        val validateMethod = MethodFinder.findMethod_returningText(
-                MethodFinderOptions
-                .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                cls,
-                methodNameCandidates,
-                new Class[] { returnType })
-                .findFirst()
-                .orElse(null);
-        if (validateMethod == null) {
-            return;
-        }
-        processMethodContext.removeMethod(validateMethod);
-
-        val facetHolder = processMethodContext.getFacetHolder();
-        // sadness: same as in TranslationFactory
-        val translationContext = TranslationContext.forTranslationContextHolder(facetHolder.getFeatureIdentifier());
-        addFacet(
-                new PropertyValidateFacetViaMethod(
-                        validateMethod, translationContext, facetHolder));
-    }
-
-    @Override
-    protected void onSearchResult(final FacetedMethod facetHolder, final ActionSupportingMethodSearchResult searchResult) {
-        // TODO Auto-generated method stub
+        MethodFinder
+        .findMethod_returningText(
+            MethodFinderOptions
+            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            processMethodContext.getCls(),
+            methodNameCandidates,
+            new Class[] { returnType })
+        .peek(processMethodContext::removeMethod)
+        .forEach(validateMethod->{
+            addFacet(
+                    new PropertyValidateFacetViaMethod(
+                            validateMethod, processMethodContext.getFacetHolder()));
+        });
 
     }
 
-
 }
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 877457c..521f2d9 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
@@ -70,8 +70,6 @@ implements MethodPrefixBasedFacetFactory {
             return;
         }
 
-        val noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
-
         programmingModel
         .addValidator(new MetaModelVisitingValidatorAbstract(programmingModel.getMetaModelContext()) {
 
@@ -113,7 +111,6 @@ implements MethodPrefixBasedFacetFactory {
 
                             val explanation =
                                     objectAction.getParameterCount() > 0
-                                            && noParamsOnly
                                             && (MemberSupportPrefix.HIDE.getMethodNamePrefixes().contains(prefix)
                                                     || MemberSupportPrefix.DISABLE.getMethodNamePrefixes().contains(prefix))
                                             ? " (such methods must not have parameters, '"
@@ -144,10 +141,14 @@ implements MethodPrefixBasedFacetFactory {
 
     protected boolean isPropertyOrMixinMain(final ProcessMethodContext processMethodContext) {
         return processMethodContext.isMixinMain()
-                || (
-                        processMethodContext.getFeatureType()!=null // null check, yet to support some JUnit tests
-                        && processMethodContext.getFeatureType().isProperty()
-                   );
+                || (processMethodContext.getFeatureType()!=null // null check, yet to support some JUnit tests
+                        && processMethodContext.getFeatureType().isProperty());
+    }
+
+    protected boolean isCollectionOrMixinMain(final ProcessMethodContext processMethodContext) {
+        return processMethodContext.isMixinMain()
+                || (processMethodContext.getFeatureType()!=null // null check, yet to support some JUnit tests
+                        && processMethodContext.getFeatureType().isCollection());
     }
 
     // -- HELPER
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
index 5071f7b..4e9b8eb 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
@@ -197,7 +197,7 @@ extends AbstractFacetFactoryTest {
             }
 
 
-            public String disableSomeAction(final int x, final long y) {
+            public String disableSomeAction() {
                 return null;
             }
         }
@@ -205,7 +205,7 @@ extends AbstractFacetFactoryTest {
         final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class });
         final Method choices0Method = findMethod(CustomerEx.class, "choices0SomeAction", new Class[] {});
         final Method choices1Method = findMethod(CustomerEx.class, "choices1SomeAction", new Class[] {});
-        final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] { int.class, long.class });
+        final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] {});
 
         final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(metaModelContext, CustomerEx.class, actionMethod);