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/08 06:18:36 UTC

[isis] branch master updated: ISIS-2774: refactor Method Name Candidates into MethodFinderOptions

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 a883341  ISIS-2774: refactor Method Name Candidates into MethodFinderOptions
a883341 is described below

commit a8833414fe3373b87491242566c18afab2d844f9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 8 08:18:23 2021 +0200

    ISIS-2774: refactor Method Name Candidates into MethodFinderOptions
---
 .../progmodel/ProgrammingModelConstants.java       | 10 +--
 .../isis/core/metamodel/facets/ActionSupport.java  | 16 ++---
 .../core/metamodel/facets/ParameterSupport.java    | 48 +++++++--------
 .../DescribedAsFacetForMemberViaMethodFactory.java |  3 +-
 .../DisableForContextFacetViaMethodFactory.java    |  3 +-
 .../HideForContextFacetViaMethodFactory.java       |  3 +-
 .../NamedFacetForMemberViaMethodFactory.java       |  3 +-
 .../object/callbacks/CallbackFacetFactory.java     | 19 +++---
 .../choices/enums/EnumValueSemanticsProvider.java  | 21 ++++---
 .../object/support/ObjectSupportFacetFactory.java  | 71 +++++++++++----------
 .../PropertyAutoCompleteFacetMethodFactory.java    |  3 +-
 .../PropertyChoicesFacetViaMethodFactory.java      |  3 +-
 .../PropertyDefaultFacetViaMethodFactory.java      |  3 +-
 .../update/PropertySetterFacetFactory.java         | 72 ++++++++++------------
 .../PropertyValidateFacetViaMethodFactory.java     |  3 +-
 .../isis/core/metamodel/methods/MethodFinder.java  | 42 +++++++------
 .../metamodel/methods/MethodFinderOptions.java     | 57 +++++++++++++----
 .../core/metamodel/methods/MethodFinderUtils.java  | 14 ++++-
 .../restfulobjects/viewer/mappers/FailureUtil.java |  5 +-
 19 files changed, 218 insertions(+), 181 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 7627cf6..104de7b 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,7 +174,11 @@ public final class ProgrammingModelConstants {
         TITLE(ReturnTypeCategory.TRANSLATABLE, "title"),
         CSS_CLASS(ReturnTypeCategory.STRING, "cssClass"),
         ICON_NAME(ReturnTypeCategory.STRING, "iconName"),
-        LAYOUT(ReturnTypeCategory.STRING, "layout");
+        LAYOUT(ReturnTypeCategory.STRING, "layout"),
+
+        /** as a fallback in the absence of other title providers */
+        TO_STRING(ReturnTypeCategory.STRING, "toString"),
+        ;
         ObjectSupportMethod(
                 final ReturnTypeCategory returnTypeCategory,
                 final String ...methodNames) {
@@ -207,10 +211,6 @@ public final class ProgrammingModelConstants {
         private final Can<String> methodNamePrefixes;
     }
 
-    // -- OTHER LITERALS
-
-    public static final String TO_STRING = "toString";
-
     // -- CONFLICTING MARKER ANNOTATIONS
 
     @Getter
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 64f02ad..c763356 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
@@ -119,8 +119,8 @@ public final class ActionSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningBoolean(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramTypes, additionalParamTypes)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramTypes, additionalParamTypes)
                 .map(ActionSupport::toSearchResult)
                 .forEach(onMethodFound);
             break;
@@ -128,8 +128,8 @@ public final class ActionSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningText(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramTypes, additionalParamTypes)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramTypes, additionalParamTypes)
                 .map(ActionSupport::toSearchResult)
                 .forEach(onMethodFound);
             break;
@@ -170,8 +170,8 @@ public final class ActionSupport {
                 MethodFinder
                     .findMethod_returningBoolean(
                             MethodFinderOptions
-                            .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                            type, methodNames, paramTypesToLookFor)
+                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                            type, paramTypesToLookFor)
                     .map(ActionSupport::toSearchResult)
                     .forEach(onMethodFound);
                 break;
@@ -179,8 +179,8 @@ public final class ActionSupport {
                 MethodFinder
                     .findMethod_returningText(
                             MethodFinderOptions
-                            .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                            type, methodNames, paramTypesToLookFor)
+                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                            type, paramTypesToLookFor)
                     .map(ActionSupport::toSearchResult)
                     .forEach(onMethodFound);
                 break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
index 1f7049a..762b30b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
@@ -136,8 +136,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningBoolean(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramTypes, additionalParamTypes)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -145,8 +145,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningText(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramTypes, additionalParamTypes)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -154,8 +154,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningNonScalar(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramType, paramTypes, additionalParamTypes)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramType, paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -163,8 +163,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramType, paramTypes, additionalParamTypes)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramType, paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -202,8 +202,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod_returningBoolean(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, singleArg)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -211,8 +211,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod_returningText(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, singleArg)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -220,8 +220,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod_returningNonScalar(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramType, singleArg)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramType, singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -229,8 +229,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod(
                         MethodFinderOptions
-                        .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                        type, methodNames, paramType, singleArg)
+                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                        type, paramType, singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -267,8 +267,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod_returningBoolean(
                             MethodFinderOptions
-                            .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                            type, methodNames, paramTypesToLookFor)
+                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                            type, paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
@@ -276,8 +276,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod_returningText(
                             MethodFinderOptions
-                            .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                            type, methodNames, paramTypesToLookFor)
+                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                            type, paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
@@ -285,8 +285,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod_returningNonScalar(
                             MethodFinderOptions
-                            .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                            type, methodNames, paramType, paramTypesToLookFor)
+                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                            type, paramType, paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
@@ -294,8 +294,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod(
                             MethodFinderOptions
-                            .memberSupport(processMethodContext.getIntrospectionPolicy()),
-                            type, methodNames, paramType, paramTypesToLookFor)
+                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
+                            type, paramType, paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
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 57fd567..039d8a0 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
@@ -44,9 +44,8 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningText(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
         .forEach(describedMethod->{
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 648b887..68945e6 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
@@ -44,9 +44,8 @@ extends MemberSupportFacetFactoryAbstract  {
          MethodFinder
          .findMethod_returningText(
              MethodFinderOptions
-             .memberSupport(processMethodContext.getIntrospectionPolicy()),
+             .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
              processMethodContext.getCls(),
-             methodNameCandidates,
              NO_ARG)
          .peek(processMethodContext::removeMethod)
          .forEach(disableMethod->{
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 a9e5b40..24b9afd 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
@@ -44,9 +44,8 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             boolean.class,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
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 a9b70dd..7139751 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
@@ -44,9 +44,8 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningText(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
         .forEach(namedMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
index a57337b..202d5ef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
@@ -29,8 +29,8 @@ import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.CallbackM
 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.MethodFinderUtils;
 import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
 import lombok.val;
@@ -65,17 +65,20 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
 
-        val callbackMethods = callbackMethodEnum
-                .getMethodNames()
-                .map(callbackMethodName->MethodFinderUtils.findMethod(
-                        MethodFinderOptions
-                        .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                        cls, callbackMethodName, void.class, NO_ARG));
+        val callbackMethods = MethodFinder
+        .findMethod(
+                MethodFinderOptions
+                .livecycleCallback(
+                        callbackMethodEnum.getMethodNames(),
+                        processClassContext.getIntrospectionPolicy()),
+                cls, void.class, NO_ARG)
+        .peek(processClassContext::removeMethod)
+        .collect(Can.toCan());
 
         if(callbackMethods.isNotEmpty()) {
-            callbackMethods.forEach(processClassContext::removeMethod);
             addFacet(callbackFacetConstructor.apply(callbackMethods, facetHolder));
         }
+
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index 1166a5c..c0e3d46 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -26,12 +26,13 @@ import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.applib.util.Enums;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
 import org.apache.isis.core.metamodel.commons.MethodExtensions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 
 import lombok.val;
 
@@ -58,9 +59,6 @@ implements EnumFacet {
         return max;
     }
 
-
-    private static final String TITLE = "title";
-
     private final Method titleMethod;
 
 //    /**
@@ -81,11 +79,16 @@ implements EnumFacet {
                 EqualByContent.HONOURED,
                 defaultFor(adaptedClass));
 
-        titleMethod = MethodFinderUtils.findMethod_returningText(
-                MethodFinderOptions.objectSupport(introspectionPolicy),
-                getAdaptedClass(),
-                TITLE,
-                null);
+        titleMethod = MethodFinder
+            .findMethod_returningText(
+                    MethodFinderOptions
+                        .objectSupport(
+                                ProgrammingModelConstants.ObjectSupportMethod.TITLE.getMethodNames(),
+                                introspectionPolicy),
+                    getAdaptedClass(),
+                    null)
+            .findFirst()
+            .orElse(null);
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
index 45d402d..08707ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
@@ -43,14 +43,12 @@ import org.apache.isis.core.metamodel.facets.object.icon.method.IconFacetViaIcon
 import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetViaLayoutMethod;
 import org.apache.isis.core.metamodel.facets.object.title.methods.TitleFacetInferredFromToStringMethod;
 import org.apache.isis.core.metamodel.facets.object.title.methods.TitleFacetViaTitleMethod;
+import org.apache.isis.core.metamodel.methods.MethodFinder;
 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 org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 
-import static org.apache.isis.core.config.progmodel.ProgrammingModelConstants.TO_STRING;
-
 import lombok.val;
 
 /**
@@ -93,29 +91,6 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         processObjectSupport(processClassContext, ObjectSupportMethod.CSS_CLASS, CssClassFacetViaCssClassMethod::create);
     }
 
-    private void processObjectSupport(
-            final ProcessClassContext processClassContext,
-            final ObjectSupportMethod objectSupportMethodEnum,
-            final BiFunction<Method, FacetHolder, Optional<? extends Facet>> ojectSupportFacetConstructor) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val requiredReturnTypes = objectSupportMethodEnum.getReturnTypeCategory().getReturnTypes();
-
-        val objectSupportMethods = objectSupportMethodEnum
-                .getMethodNames()
-                .map(callbackMethodName->MethodFinderUtils.findMethod_returningAnyOf(
-                        MethodFinderOptions
-                        .objectSupport(processClassContext.getIntrospectionPolicy()),
-                        requiredReturnTypes,
-                        cls, callbackMethodName, NO_ARG));
-
-        objectSupportMethods
-        .forEach(method->{
-            addFacetIfPresent(ojectSupportFacetConstructor.apply(method, facetHolder));
-            processClassContext.removeMethod(method);
-        });
-    }
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         final FacetedMethod member = processMethodContext.getFacetHolder();
@@ -134,14 +109,42 @@ extends MethodPrefixBasedFacetFactoryAbstract {
     // -- HELPER
 
     private void inferTitleFromToString(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val toStringMethod = MethodFinderUtils.findMethod(
-                MethodFinderOptions.publicOnly(),
-                cls, TO_STRING, String.class, NO_ARG);
-        processClassContext.removeMethod(toStringMethod);
-        addFacetIfPresent(TitleFacetInferredFromToStringMethod
-                .create(toStringMethod, facetHolder));
+
+        val toString = ObjectSupportMethod.TO_STRING;
+
+        MethodFinder
+        .findMethod_returningCategory(
+                MethodFinderOptions.publicOnly(toString.getMethodNames()),
+                toString.getReturnTypeCategory(),
+                processClassContext.getCls(),
+                NO_ARG)
+        .peek(processClassContext::removeMethod)
+        .forEach(method->{
+            addFacetIfPresent(TitleFacetInferredFromToStringMethod
+                    .create(method, processClassContext.getFacetHolder()));
+        });
+
+    }
+
+    private void processObjectSupport(
+            final ProcessClassContext processClassContext,
+            final ObjectSupportMethod objectSupportMethodEnum,
+            final BiFunction<Method, FacetHolder, Optional<? extends Facet>> ojectSupportFacetConstructor) {
+
+        MethodFinder
+        .findMethod_returningCategory(
+                MethodFinderOptions
+                .objectSupport(
+                        objectSupportMethodEnum.getMethodNames(),
+                        processClassContext.getIntrospectionPolicy()),
+                objectSupportMethodEnum.getReturnTypeCategory(),
+                processClassContext.getCls(),
+                NO_ARG)
+        .peek(processClassContext::removeMethod)
+        .forEach(method->{
+            addFacetIfPresent(ojectSupportFacetConstructor
+                    .apply(method, processClassContext.getFacetHolder()));
+        });
     }
 
 
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 cc70adc..dcc9201 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
@@ -49,9 +49,8 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningNonScalar(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             returnType,
             STRING_ARG)
         .peek(processMethodContext::removeMethod)
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 a1eea83..3562ac3 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
@@ -49,9 +49,8 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningNonScalar(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             returnType,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
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 25ae13f..8930253 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
@@ -49,9 +49,8 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             returnType,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
index af75732..5b114d4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
@@ -24,18 +24,25 @@ 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.ReturnTypeCategory;
 import org.apache.isis.core.metamodel.commons.StringExtensions;
 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.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacetViaSetterMethod;
 import org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacetViaSetterMethod;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacetViaSetterMethod;
+import org.apache.isis.core.metamodel.methods.MethodFinder;
 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;
+
+/**
+ * Sets up the {@link PropertySetterFacetViaSetterMethod} to invoke the
+ * property's setter if available, but if none then marks the property as
+ * {@link SnapshotExcludeFacetInferred not-persistable}.
+ */
 public class PropertySetterFacetFactory
 extends MethodPrefixBasedFacetFactoryAbstract {
 
@@ -49,39 +56,33 @@ extends MethodPrefixBasedFacetFactoryAbstract {
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        final Method setterMethod = attachPropertyModifyFacetIfSetterIsFound(processMethodContext);
-
-        attachPropertyClearFacetUsingSetterIfRequired(processMethodContext, setterMethod);
-    }
-
-    /**
-     * Sets up the {@link PropertySetterFacetViaSetterMethod} to invoke the
-     * property's setter if available, but if none then marks the property as
-     * {@link NotPersistableFacet not-persistable} and {@link DisabledFacet
-     * disabled} otherwise.
-     */
-    private Method attachPropertyModifyFacetIfSetterIsFound(
-            final ProcessMethodContext processMethodContext) {
-
         final Method getterMethod = processMethodContext.getMethod();
         final String capitalizedName = StringExtensions.asJavaBaseName(getterMethod.getName());
+        val methodNameCandidates = Can.ofSingleton(
+                ProgrammingModelConstants.AccessorPrefix.SET.prefix(capitalizedName));
+
+        final Class<?>[] paramTypes = new Class[] { getterMethod.getReturnType() };
 
-        final Class<?> cls = processMethodContext.getCls();
-        final Class<?> returnType = getterMethod.getReturnType();
-        final Class<?>[] paramTypes = new Class[] { returnType };
-        final Method setterMethod = MethodFinderUtils
-                .findMethod(
-                        MethodFinderOptions
-                        .accessor(processMethodContext.getIntrospectionPolicy()),
-                        cls,
-                        ProgrammingModelConstants.AccessorPrefix.SET.prefix(capitalizedName),
-                        void.class, paramTypes);
-        processMethodContext.removeMethod(setterMethod);
+        val setterMethods = MethodFinder
+        .findMethod_returningCategory(
+                MethodFinderOptions
+                .accessor(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
+                ReturnTypeCategory.VOID,
+                processMethodContext.getCls(),
+                paramTypes)
+        .peek(processMethodContext::removeMethod)
+        .collect(Can.toCan());
 
         final FacetHolder property = processMethodContext.getFacetHolder();
-        if (setterMethod != null) {
-            addFacet(new PropertySetterFacetViaSetterMethod(setterMethod, property));
-            addFacet(new PropertyInitializationFacetViaSetterMethod(setterMethod, property));
+        if (setterMethods.isNotEmpty()) {
+
+            setterMethods
+            .forEach(setterMethod->{
+                addFacet(new PropertySetterFacetViaSetterMethod(setterMethod, property));
+                addFacet(new PropertyInitializationFacetViaSetterMethod(setterMethod, property));
+                addFacet(new PropertyClearFacetViaSetterMethod(setterMethod, property));
+            });
+
         } else {
             addFacet(new SnapshotExcludeFacetInferred(property));
 
@@ -92,17 +93,6 @@ extends MethodPrefixBasedFacetFactoryAbstract {
 
         }
 
-        return setterMethod;
-    }
-
-    private void attachPropertyClearFacetUsingSetterIfRequired(
-            final ProcessMethodContext processMethodContext, final Method setMethod) {
-
-        if (setMethod == null) {
-            return;
-        }
-        final FacetHolder property = processMethodContext.getFacetHolder();
-        addFacet(new PropertyClearFacetViaSetterMethod(setMethod, property));
     }
 
 }
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 ebe907a..7d7bed0 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
@@ -49,9 +49,8 @@ extends MemberSupportFacetFactoryAbstract  {
         MethodFinder
         .findMethod_returningText(
             MethodFinderOptions
-            .memberSupport(processMethodContext.getIntrospectionPolicy()),
+            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
             processMethodContext.getCls(),
-            methodNameCandidates,
             new Class[] { returnType })
         .peek(processMethodContext::removeMethod)
         .forEach(validateMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
index 6d0e329..aced3b3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
@@ -23,6 +23,7 @@ import java.util.stream.Stream;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnTypeCategory;
 import org.apache.isis.core.metamodel.methods.MethodFinderUtils.MethodAndPpmConstructor;
 
 /**
@@ -35,11 +36,10 @@ public final class MethodFinder {
     public static Stream<Method> findMethod(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?> expectedReturnType,
             final Class<?>[] paramTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethod(options, type, name, expectedReturnType, paramTypes))
@@ -48,13 +48,25 @@ public final class MethodFinder {
 
     // -- SEARCH FOR MULTIPLE NAME CANDIDATES
 
+    public static Stream<Method> findMethod_returningCategory(
+            final MethodFinderOptions options,
+            final ReturnTypeCategory returnTypeCategory,
+            final Class<?> type,
+            final Class<?>[] paramTypes) {
+
+        return options.getMethodNameCandidates().stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethod_returningCategory(options, returnTypeCategory, type, name, paramTypes))
+        .filter(_NullSafe::isPresent);
+    }
+
     public static Stream<Method> findMethod_returningBoolean(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?>[] paramTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethod_returningBoolean(options, type, name, paramTypes))
@@ -64,10 +76,9 @@ public final class MethodFinder {
     public static Stream<Method> findMethod_returningText(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?>[] paramTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethod_returningText(options, type, name, paramTypes))
@@ -77,29 +88,26 @@ public final class MethodFinder {
     public static Stream<Method> findMethod_returningNonScalar(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?> elementReturnType,
             final Class<?>[] paramTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethod_returningNonScalar(options, type, name, elementReturnType, paramTypes))
         .filter(_NullSafe::isPresent);
     }
 
-
     // -- SEARCH FOR MULTIPLE NAME CANDIDATES (PPM)
 
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?> returnType,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethodWithPPMArg(options, type, name, returnType, paramTypes, additionalParamTypes))
@@ -110,11 +118,10 @@ public final class MethodFinder {
             final MethodFinderOptions options,
             final Can<Class<?>> returnTypes,
             final Class<?> type,
-            final Can<String> names,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethodWithPPMArg_returningAnyOf(options, returnTypes, type, name, paramTypes, additionalParamTypes))
@@ -124,11 +131,10 @@ public final class MethodFinder {
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningBoolean(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethodWithPPMArg_returningBoolean(options, type, name, paramTypes, additionalParamTypes))
@@ -138,11 +144,10 @@ public final class MethodFinder {
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningText(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethodWithPPMArg_returningText(options, type, name, paramTypes, additionalParamTypes))
@@ -152,12 +157,11 @@ public final class MethodFinder {
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningNonScalar(
             final MethodFinderOptions options,
             final Class<?> type,
-            final Can<String> names,
             final Class<?> elementReturnType,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return names.stream()
+        return options.getMethodNameCandidates().stream()
         .distinct()
         .map(name->MethodFinderUtils
                 .findMethodWithPPMArg_returningNonScalar(options, type, name, elementReturnType, paramTypes, additionalParamTypes))
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
index 80011ab..347a27c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
@@ -30,6 +30,7 @@ import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ConflictingAnnotations;
 
 import lombok.NonNull;
 import lombok.Value;
@@ -40,60 +41,92 @@ public class MethodFinderOptions {
 
     public static MethodFinderOptions notNecessarilyPublic() {
         return of(
+                Can.empty(), //FIXME
                 EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED,
                 _Predicates.alwaysTrue()
                 );
     }
 
-    public static MethodFinderOptions publicOnly() {
+    public static MethodFinderOptions publicOnly(
+            final Can<String> methodNameCandidates) {
         return of(
+                methodNameCandidates,
                 EncapsulationPolicy.ONLY_PUBLIC_MEMBERS_SUPPORTED,
                 _Predicates.alwaysTrue()
                 );
     }
 
     public static MethodFinderOptions accessor(
+            final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
-        return havingAnyOrNoAnnotation(memberIntrospectionPolicy);
+        return havingAnyOrNoAnnotation(
+                methodNameCandidates,
+                memberIntrospectionPolicy);
     }
 
     public static MethodFinderOptions objectSupport(
+            final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
-        return havingAnnotationIfEnforcedByPolicyOrAccessibility(
+        return supportMethod(
+                methodNameCandidates,
                 memberIntrospectionPolicy,
                 Domain.Include.class,
-                ProgrammingModelConstants.ConflictingAnnotations.OBJECT_SUPPORT.getProhibits());
+                ProgrammingModelConstants.ConflictingAnnotations.OBJECT_SUPPORT);
     }
 
     public static MethodFinderOptions livecycleCallback(
+            final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
-        return havingAnnotationIfEnforcedByPolicyOrAccessibility(
+        return supportMethod(
+                methodNameCandidates,
                 memberIntrospectionPolicy,
                 Domain.Include.class,
-                ProgrammingModelConstants.ConflictingAnnotations.OBJECT_LIFECYCLE.getProhibits());
+                ProgrammingModelConstants.ConflictingAnnotations.OBJECT_LIFECYCLE);
     }
 
     public static MethodFinderOptions memberSupport(
+            final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
-        return havingAnnotationIfEnforcedByPolicyOrAccessibility(
+        return supportMethod(
+                methodNameCandidates,
                 memberIntrospectionPolicy,
                 Domain.Include.class,
-                ProgrammingModelConstants.ConflictingAnnotations.MEMBER_SUPPORT.getProhibits());
+                ProgrammingModelConstants.ConflictingAnnotations.MEMBER_SUPPORT);
     }
 
+    private final @NonNull Can<String> methodNameCandidates;
     private final @NonNull EncapsulationPolicy encapsulationPolicy;
     private final @NonNull Predicate<Method> mustSatisfy;
 
     // -- HELPER
 
     private static MethodFinderOptions havingAnyOrNoAnnotation(
+            final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
         return of(
+                methodNameCandidates,
                 memberIntrospectionPolicy.getEncapsulationPolicy(),
                 _Predicates.alwaysTrue());
     }
 
-    private static MethodFinderOptions havingAnnotationIfEnforcedByPolicyOrAccessibility(
+    private static MethodFinderOptions supportMethod(
+            final Can<String> methodNameCandidates,
+            final IntrospectionPolicy memberIntrospectionPolicy,
+            final Class<? extends Annotation> annotationType,
+            final ConflictingAnnotations conflictingAnnotations) {
+
+        return of(
+                methodNameCandidates,
+                // support methods are always allowed private
+                EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED,
+                havingAnnotationIfEnforcedByPolicyOrAccessibility(
+                        memberIntrospectionPolicy,
+                        annotationType,
+                        conflictingAnnotations.getProhibits()));
+
+    }
+
+    private static Predicate<Method> havingAnnotationIfEnforcedByPolicyOrAccessibility(
             final IntrospectionPolicy memberIntrospectionPolicy,
             final Class<? extends Annotation> annotationType,
             final Can<Class<? extends Annotation>> conflictingAnnotations) {
@@ -102,13 +135,11 @@ public class MethodFinderOptions {
         //  when REQUIRED -> annot. on support also required
         //  when OPTIONAL -> annot. on support only required when support method is private
 
-        return of(
-                EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED, // support methods are always allowed private
-                memberIntrospectionPolicy.getMemberAnnotationPolicy().isMemberAnnotationsRequired()
+        return memberIntrospectionPolicy.getMemberAnnotationPolicy().isMemberAnnotationsRequired()
                     ? method->havingAnnotation(method, annotationType, conflictingAnnotations)
                     : method-> !_Reflect.isAccessible(method)
                             ? havingAnnotation(method, annotationType, conflictingAnnotations)
-                            : true);
+                            : true;
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
index f09b862..4dcadc0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
@@ -129,8 +129,8 @@ public final class MethodFinderUtils {
 
     public static Optional<Method> findNoArgMethod(
             final MethodFinderOptions options,
-            final Class<?> type, final String name, final Class<?> returnType) {
-        return streamMethods(options, type, Can.ofSingleton(name), returnType)
+            final Class<?> type, final Class<?> returnType) {
+        return streamMethods(options, type, options.getMethodNameCandidates(), returnType)
                 .filter(MethodUtil.Predicates.paramCount(0))
                 .findFirst();
     }
@@ -222,6 +222,16 @@ public final class MethodFinderUtils {
 
     // -- SHORTCUTS
 
+    public static Method findMethod_returningCategory(
+            final MethodFinderOptions options,
+            final ReturnTypeCategory returnTypeCategory,
+            final Class<?> type,
+            final String name,
+            final Class<?>[] paramTypes) {
+        return findMethod_returningAnyOf(
+                options, returnTypeCategory.getReturnTypes(), type, name, paramTypes);
+    }
+
     public static Method findMethod_returningBoolean(
             final MethodFinderOptions options,
             final Class<?> type,
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
index 528d91a..37d66e9 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
@@ -20,6 +20,7 @@ package org.apache.isis.viewer.restfulobjects.viewer.mappers;
 
 import java.lang.reflect.InvocationTargetException;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulResponse;
@@ -34,8 +35,8 @@ final class FailureUtil {
     public static HttpStatusCode getFailureStatusCodeIfAny(final Throwable ex) {
 
         val errorCodeGetter = MethodFinderUtils.findNoArgMethod(
-                MethodFinderOptions.publicOnly(),
-                ex.getClass(), "getErrorCode", int.class)
+                MethodFinderOptions.publicOnly(Can.ofSingleton("getErrorCode")),
+                ex.getClass(), int.class)
                 .orElse(null);
         if(errorCodeGetter!=null) {
             try {