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 2020/07/17 17:13:12 UTC

[isis] branch master updated: ISIS-2362: add new supporting method naming convention

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 5bf00e8  ISIS-2362: add new supporting method naming convention
5bf00e8 is described below

commit 5bf00e8a897e1b213972ca19f09080b0d48ec060
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jul 17 19:09:29 2020 +0200

    ISIS-2362: add new supporting method naming convention
    
    - prepares the framework to support multiple method naming conventions
    - for mixins we allow supporting methods to reference their
    corresponding action parameter by name only (instead of number and
    action name)
    - eg. valid mixin code now
    - - public int act(int a, int b){...}
    - - public int defaultA(...){...}
    - - public int[] choicesB(...){...}
---
 .../isis/core/metamodel/facets/MethodFinder2.java  | 169 +++++++++++++++++++++
 .../metamodel/facets/MethodLiteralConstants.java   |  28 +++-
 .../MethodPrefixBasedFacetFactoryAbstract.java     |   6 +-
 .../core/metamodel/facets/ParameterSupport.java    |  65 ++++----
 .../ActionDefaultsFacetViaMethodFactory.java       |   9 +-
 .../ActionValidationFacetViaMethodFactory.java     |   8 +-
 .../DisableForContextFacetViaMethodFactory.java    |  12 +-
 .../HideForContextFacetViaMethodFactory.java       |  12 +-
 ...ParameterAutoCompleteFacetViaMethodFactory.java |   4 +-
 .../method/ActionChoicesFacetViaMethodFactory.java |   6 +-
 ...ctionParameterChoicesFacetViaMethodFactory.java |   6 +-
 ...tionParameterDefaultsFacetViaMethodFactory.java |   4 +-
 ...tionParameterDisabledFacetViaMethodFactory.java |   4 +-
 ...ActionParameterHiddenFacetViaMethodFactory.java |   4 +-
 ...onParameterValidationFacetViaMethodFactory.java |   4 +-
 .../PropertyAutoCompleteFacetMethodFactory.java    |  10 +-
 .../PropertyChoicesFacetViaMethodFactory.java      |  11 +-
 .../PropertyDefaultFacetViaMethodFactory.java      |  10 +-
 .../PropertyValidateFacetViaMethodFactory.java     |   9 +-
 .../InteractionNpmDemo_biArgDisabled.java          |   5 +-
 .../InteractionNpmDemo_biArgEnabled.java           |  12 +-
 .../testdomain/interact/NewParameterModelTest.java |  13 +-
 22 files changed, 313 insertions(+), 98 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinder2.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinder2.java
new file mode 100644
index 0000000..d586f71
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinder2.java
@@ -0,0 +1,169 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.base._NullSafe;
+import org.apache.isis.core.metamodel.facets.MethodFinderUtils.MethodAndPpmConstructor;
+
+/**
+ * An extension to {@link MethodFinderUtils} in support of multiple simultaneous naming conventions.
+ * @apiNote each method name candidate is processed in sequence as given by {@code Can<String> names}, 
+ * first one found wins  
+ */
+//@Log4j2
+public final class MethodFinder2 {
+
+    public static Method findMethod(
+            final Class<?> type,
+            final Can<String> names,
+            final Class<?> expectedReturnType,
+            final Class<?>[] paramTypes) {
+        
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethod(type, name, expectedReturnType, paramTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+    
+    // -- SEARCH FOR MULTIPLE NAME CANDIDATES
+    
+    public static Method findMethod_returningBoolean(
+            final Class<?> type,
+            final Can<String> names, 
+            final Class<?>[] paramTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethod_returningBoolean(type, name, paramTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+    
+    public static Method findMethod_returningText(
+            final Class<?> type,
+            final Can<String> names, 
+            final Class<?>[] paramTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethod_returningText(type, name, paramTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+    
+    public static Method findMethod_returningNonScalar(
+            final Class<?> type,
+            final Can<String> names,  
+            final Class<?> elementReturnType,
+            final Class<?>[] paramTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethod_returningNonScalar(type, name, elementReturnType, paramTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+    
+    
+    // -- SEARCH FOR MULTIPLE NAME CANDIDATES (PPM)
+    
+    public static MethodAndPpmConstructor findMethodWithPPMArg(
+            final Class<?> type, 
+            final Can<String> names, 
+            final Class<?> returnType,
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethodWithPPMArg(type, name, returnType, paramTypes, additionalParamTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+    
+    public static MethodAndPpmConstructor findMethodWithPPMArg_returningAnyOf(
+            final Class<?>[] returnTypes,
+            final Class<?> type,
+            final Can<String> names, 
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethodWithPPMArg_returningAnyOf(returnTypes, type, name, paramTypes, additionalParamTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    } 
+
+    public static MethodAndPpmConstructor findMethodWithPPMArg_returningBoolean(
+            final Class<?> type, 
+            final Can<String> names, 
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethodWithPPMArg_returningBoolean(type, name, paramTypes, additionalParamTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+
+    public static MethodAndPpmConstructor findMethodWithPPMArg_returningText(
+            final Class<?> type, 
+            final Can<String> names, 
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethodWithPPMArg_returningText(type, name, paramTypes, additionalParamTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+
+    public static MethodAndPpmConstructor findMethodWithPPMArg_returningNonScalar(
+            final Class<?> type, 
+            final Can<String> names, 
+            final Class<?> elementReturnType,
+            final Class<?>[] paramTypes, 
+            final Can<Class<?>> additionalParamTypes) {
+        return names.stream()
+        .distinct()
+        .map(name->MethodFinderUtils
+                .findMethodWithPPMArg_returningNonScalar(type, name, elementReturnType, paramTypes, additionalParamTypes))
+        .filter(_NullSafe::isPresent)
+        .findFirst()
+        .orElse(null);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodLiteralConstants.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodLiteralConstants.java
index ff2f801..3b80695 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodLiteralConstants.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodLiteralConstants.java
@@ -79,16 +79,16 @@ public final class MethodLiteralConstants {
 
             @Override
             protected String getActionSupportingMethodName(Method actionMethod, String prefix) {
-                final String capitalizedName = 
+                final String capitalizedActionName = 
                         StringExtensions.asCapitalizedName(actionMethod.getName());
-                return prefix + capitalizedName;
+                return prefix + capitalizedActionName;
             }
 
             @Override
             protected String getParameterSupportingMethodName(Method actionMethod, String prefix, int paramNum) {
-                final String capitalizedName = 
+                final String capitalizedActionName = 
                         StringExtensions.asCapitalizedName(actionMethod.getName());
-                return prefix + paramNum + capitalizedName;
+                return prefix + paramNum + capitalizedActionName;
             }
             
             @Override
@@ -110,7 +110,27 @@ public final class MethodLiteralConstants {
                 return prefix + capitalizedName;
             }
             
+        },
+        
+        /** version 2.x, introduced for mixins eg. hide(...), hideParamname(...)*/
+        PREFIX_PARAMNAME_USING_PARAMETERS_RECORD {
+            @Override
+            protected String getActionSupportingMethodName(Method actionMethod, String prefix) {
+                return prefix;
+            }
+            @Override
+            protected String getParameterSupportingMethodName(Method actionMethod, String prefix, int paramNum) {
+                final String capitalizedParamName = 
+                        StringExtensions.asCapitalizedName(actionMethod.getParameters()[paramNum].getName());
+                return prefix + capitalizedParamName;
+            }
+            @Override
+            protected String getMemberSupportingMethodName(Member member, String prefix) {
+                // same as classic ???
+                return PREFIX_PARAMNUM_ACTION.getMemberSupportingMethodName(member, prefix);
+            }
         }
+        
         ;
         
         protected abstract String getActionSupportingMethodName(Method actionMethod, String prefix);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
index d5302ef..03fe30c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
@@ -36,8 +36,10 @@ public abstract class MethodPrefixBasedFacetFactoryAbstract
 extends FacetFactoryAbstract
 implements MethodPrefixBasedFacetFactory {
     
-    protected static final SupportingMethodNamingConvention PREFIX_BASED_NAMING = 
-            SupportingMethodNamingConvention.PREFIX_PARAMNUM_ACTION;
+    protected static final Can<SupportingMethodNamingConvention> PREFIX_BASED_NAMING = 
+            Can.of(
+                    SupportingMethodNamingConvention.PREFIX_PARAMNUM_ACTION,
+                    SupportingMethodNamingConvention.PREFIX_PARAMNAME_USING_PARAMETERS_RECORD); // new since v2 [ISIS-2362]
     
     @Getter(onMethod = @__(@Override))
     private final Can<String> prefixes;
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 5c64a19..70d8cd3 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
@@ -64,7 +64,7 @@ public class ParameterSupport {
         }
         
         @NonNull FacetFactory.ProcessMethodContext processMethodContext;
-        @NonNull IntFunction<String> paramIndexToMethodName;
+        @NonNull Can<IntFunction<String>> paramIndexToMethodNameProviders;
         @NonNull EnumSet<SearchAlgorithm> searchAlgorithms; 
         @NonNull ReturnType returnType;
         
@@ -72,6 +72,12 @@ public class ParameterSupport {
         
         @Getter(lazy = true)
         Class<?>[] paramTypes = getProcessMethodContext().getMethod().getParameterTypes();
+        
+        Can<String> getSupporingMethodNameCandidates(final int paramNr) {
+            //TODO optimization make unique, without loosing order
+            return getParamIndexToMethodNameProviders()
+                    .map(provider->provider.apply(paramNr));
+        }
     }
     
     @Value(staticConstructor = "of")
@@ -140,7 +146,8 @@ public class ParameterSupport {
         val processMethodContext = searchRequest.getProcessMethodContext();
         val type = processMethodContext.getCls();
         val paramTypes = searchRequest.getParamTypes();
-        val methodName = searchRequest.getParamIndexToMethodName().apply(paramIndex);
+        val methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
+                
         val paramType = paramTypes[paramIndex];
         val additionalParamTypes = Can.ofNullable(searchRequest.getAdditionalParamType());
         
@@ -148,20 +155,20 @@ public class ParameterSupport {
         
         switch(searchRequest.getReturnType()) {
         case BOOLEAN:
-            supportingMethodAndPpmConstructor = MethodFinderUtils
-                .findMethodWithPPMArg_returningBoolean(type, methodName, paramTypes, additionalParamTypes);
+            supportingMethodAndPpmConstructor = MethodFinder2
+                .findMethodWithPPMArg_returningBoolean(type, methodNames, paramTypes, additionalParamTypes);
             break;
         case TEXT:
-            supportingMethodAndPpmConstructor = MethodFinderUtils
-                .findMethodWithPPMArg_returningText(type, methodName, paramTypes, additionalParamTypes);
+            supportingMethodAndPpmConstructor = MethodFinder2
+                .findMethodWithPPMArg_returningText(type, methodNames, paramTypes, additionalParamTypes);
             break;
         case NON_SCALAR:
-            supportingMethodAndPpmConstructor = MethodFinderUtils
-                .findMethodWithPPMArg_returningNonScalar(type, methodName, paramType, paramTypes, additionalParamTypes);
+            supportingMethodAndPpmConstructor = MethodFinder2
+                .findMethodWithPPMArg_returningNonScalar(type, methodNames, paramType, paramTypes, additionalParamTypes);
             break;
         case SAME_AS_PARAMETER_TYPE:
-            supportingMethodAndPpmConstructor = MethodFinderUtils
-                .findMethodWithPPMArg(type, methodName, paramType, paramTypes, additionalParamTypes);
+            supportingMethodAndPpmConstructor = MethodFinder2
+                .findMethodWithPPMArg(type, methodNames, paramType, paramTypes, additionalParamTypes);
             break;
         default:
             supportingMethodAndPpmConstructor = null;
@@ -196,7 +203,7 @@ public class ParameterSupport {
         val processMethodContext = searchRequest.getProcessMethodContext();
         val type = processMethodContext.getCls();
         val paramTypes = searchRequest.getParamTypes();
-        val methodName = searchRequest.getParamIndexToMethodName().apply(paramIndex);
+        val methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
         val paramType = paramTypes[paramIndex];
         val singleArg = new Class<?>[]{paramType};
         
@@ -204,20 +211,20 @@ public class ParameterSupport {
         
         switch(searchRequest.getReturnType()) {
         case BOOLEAN:
-            supportingMethod = MethodFinderUtils
-                .findMethod_returningBoolean(type, methodName, singleArg);
+            supportingMethod = MethodFinder2
+                .findMethod_returningBoolean(type, methodNames, singleArg);
             break;
         case TEXT:
-            supportingMethod = MethodFinderUtils
-                .findMethod_returningText(type, methodName, singleArg);
+            supportingMethod = MethodFinder2
+                .findMethod_returningText(type, methodNames, singleArg);
             break;
         case NON_SCALAR:
-            supportingMethod = MethodFinderUtils
-                .findMethod_returningNonScalar(type, methodName, paramType, singleArg);
+            supportingMethod = MethodFinder2
+                .findMethod_returningNonScalar(type, methodNames, paramType, singleArg);
             break;
         case SAME_AS_PARAMETER_TYPE:
-            supportingMethod = MethodFinderUtils
-                .findMethod(type, methodName, paramType, singleArg);
+            supportingMethod = MethodFinder2
+                .findMethod(type, methodNames, paramType, singleArg);
             break;
         default:
             supportingMethod = null;
@@ -242,7 +249,7 @@ public class ParameterSupport {
         val processMethodContext = searchRequest.getProcessMethodContext();
         val type = processMethodContext.getCls();
         val paramTypes = searchRequest.getParamTypes();
-        val methodName = searchRequest.getParamIndexToMethodName().apply(paramIndex);
+        val methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
         val paramType = paramTypes[paramIndex];
         val additionalParamType = searchRequest.getAdditionalParamType();
         val additionalParamCount = additionalParamType!=null ? 1 : 0;
@@ -256,20 +263,20 @@ public class ParameterSupport {
             
             switch(searchRequest.getReturnType()) {
             case BOOLEAN:
-                supportingMethod = MethodFinderUtils
-                    .findMethod_returningBoolean(type, methodName, paramTypesToLookFor);
+                supportingMethod = MethodFinder2
+                    .findMethod_returningBoolean(type, methodNames, paramTypesToLookFor);
                 break;
             case TEXT:
-                supportingMethod = MethodFinderUtils
-                    .findMethod_returningText(type, methodName, paramTypesToLookFor);
+                supportingMethod = MethodFinder2
+                    .findMethod_returningText(type, methodNames, paramTypesToLookFor);
                 break;
             case NON_SCALAR:
-                supportingMethod = MethodFinderUtils
-                    .findMethod_returningNonScalar(type, methodName, paramType, paramTypesToLookFor);
+                supportingMethod = MethodFinder2
+                    .findMethod_returningNonScalar(type, methodNames, paramType, paramTypesToLookFor);
                 break;
             case SAME_AS_PARAMETER_TYPE:
-                supportingMethod = MethodFinderUtils
-                    .findMethod(type, methodName, paramType, paramTypesToLookFor);
+                supportingMethod = MethodFinder2
+                    .findMethod(type, methodNames, paramType, paramTypesToLookFor);
                 break;
             default:
                 supportingMethod = null;
@@ -322,7 +329,7 @@ public class ParameterSupport {
         
         return String.format("%s.%s(%s) : %s",
                 searchRequest.getProcessMethodContext().getCls().getSimpleName(),
-                searchRequest.getParamIndexToMethodName().apply(paramIndex),
+                searchRequest.getSupporingMethodNameCandidates(paramIndex),
                 toString(searchRequest.getParamTypes()),
                 searchRequest.getReturnType().name()
                 );
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
index 90b331e..2e35cbf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
@@ -23,10 +23,9 @@ import java.lang.reflect.Method;
 import java.util.List;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.commons.internal._Constants;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -71,10 +70,10 @@ public class ActionDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetF
             final Class<?> returnType) {
 
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForAction(actionMethod, PREFIX);
         val cls = processMethodContext.getCls();
-        return MethodFinderUtils.findMethod(
-                cls, namingConvention.get(), returnType, NO_ARG);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForAction(actionMethod, PREFIX));
+        return MethodFinder2.findMethod(
+                cls, namingConvention.map(x->x.get()), returnType, NO_ARG);
     }
 
 }
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 cfd2e60..2483550 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
@@ -24,7 +24,7 @@ import java.lang.reflect.Method;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFacet;
@@ -56,11 +56,11 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         val paramTypes = actionMethod.getParameterTypes();
 
-        val namingConvention = PREFIX_BASED_NAMING.providerForAction(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForAction(actionMethod, PREFIX));
         
-        final Method validateMethod = MethodFinderUtils.findMethod_returningText(
+        final Method validateMethod = MethodFinder2.findMethod_returningText(
                 cls,
-                namingConvention.get(),
+                namingConvention.map(x->x.get()),
                 paramTypes);
         if (validateMethod == null) {
             return;
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 5da2fb2..bd819e3 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
@@ -26,7 +26,7 @@ import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -54,22 +54,22 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         Method disableMethod = null;
         
-        val namingConvention = PREFIX_BASED_NAMING.providerForMember(actionOrGetter, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForMember(actionOrGetter, PREFIX));
 
         boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
         boolean searchExactMatch = !noParamsOnly;
         if(searchExactMatch) {
             // search for exact match
-            disableMethod = MethodFinderUtils.findMethod_returningText(
+            disableMethod = MethodFinder2.findMethod_returningText(
                     cls,
-                    namingConvention.get(),
+                    namingConvention.map(x->x.get()),
                     actionOrGetter.getParameterTypes());
         }
         if (disableMethod == null) {
             // search for no-arg version
-            disableMethod = MethodFinderUtils.findMethod_returningText(
+            disableMethod = MethodFinder2.findMethod_returningText(
                     cls,
-                    namingConvention.get(),
+                    namingConvention.map(x->x.get()),
                     NO_ARG);
         }
         if (disableMethod == null) {
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 d1178db..5e30d6e 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
@@ -25,7 +25,7 @@ import org.apache.isis.core.commons.collections.Can;
 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.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -49,12 +49,12 @@ extends MethodPrefixBasedFacetFactoryAbstract {
 
         final Method actionOrGetter = processMethodContext.getMethod();
         
-        val namingConvention = PREFIX_BASED_NAMING.providerForMember(actionOrGetter, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForMember(actionOrGetter, PREFIX));
         
         val cls = processMethodContext.getCls();
-        Method hideMethod = MethodFinderUtils.findMethod(
+        Method hideMethod = MethodFinder2.findMethod(
                 cls, 
-                namingConvention.get(), 
+                namingConvention.map(x->x.get()), 
                 boolean.class, 
                 NO_ARG);
         if (hideMethod == null) {
@@ -62,9 +62,9 @@ extends MethodPrefixBasedFacetFactoryAbstract {
             boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
             boolean searchExactMatch = !noParamsOnly;
             if(searchExactMatch) {
-                hideMethod = MethodFinderUtils.findMethod(
+                hideMethod = MethodFinder2.findMethod(
                         cls, 
-                        namingConvention.get(), 
+                        namingConvention.map(x->x.get()), 
                         boolean.class, 
                         actionOrGetter.getParameterTypes());
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index 2dbea29..9c775de 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -54,13 +54,13 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
         // attach ActionParameterChoicesFacet if autoCompleteNumMethod is found ...
         
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForParam(actionMethod, PREFIX));
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.NON_SCALAR)
                 .additionalParamType(String.class)
-                .paramIndexToMethodName(namingConvention)
+                .paramIndexToMethodNameProviders(namingConvention)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
                 .build();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
index 6698a28..73ab9f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
@@ -25,7 +25,7 @@ import java.util.Collection;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -80,10 +80,10 @@ public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFa
 
         val cls = processMethodContext.getCls();
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForAction(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForAction(actionMethod, PREFIX));
         
         Method choicesMethod = 
-                MethodFinderUtils.findMethod(cls, namingConvention.get(), returnType, NO_ARG);
+                MethodFinder2.findMethod(cls, namingConvention.map(x->x.get()), returnType, NO_ARG);
         return choicesMethod;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index b2167cf..7f034c3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -27,8 +27,8 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
-import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
 
 import lombok.val;
@@ -59,12 +59,12 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         // attach ActionChoicesFacet if choicesNumMethod is found ...
 
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForParam(actionMethod, PREFIX)); 
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.NON_SCALAR)
-                .paramIndexToMethodName(namingConvention)
+                .paramIndexToMethodNameProviders(namingConvention)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
                 .build();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
index 417ecc6..b11d387 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
@@ -62,12 +62,12 @@ public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBa
         // attach DefaultFacetForParameters if defaultNumMethod is found ...
         
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForParam(actionMethod, PREFIX));
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.SAME_AS_PARAMETER_TYPE)
-                .paramIndexToMethodName(namingConvention)
+                .paramIndexToMethodNameProviders(namingConvention)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
                 .build();
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
index 5de0cb9..cec518d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
@@ -58,12 +58,12 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
         // attach ActionParameterDisabledFacet if disableNumMethod is found ...
         
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForParam(actionMethod, PREFIX));
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.TEXT)
-                .paramIndexToMethodName(namingConvention)
+                .paramIndexToMethodNameProviders(namingConvention)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
                 .build();
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
index 909800e..07e6ec8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
@@ -57,12 +57,12 @@ public class ActionParameterHiddenFacetViaMethodFactory extends MethodPrefixBase
         // attach ActionParameterHiddenFacet if hideNumMethod is found ...
         
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForParam(actionMethod, PREFIX));
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.BOOLEAN)
-                .paramIndexToMethodName(namingConvention)
+                .paramIndexToMethodNameProviders(namingConvention)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
                 .build();
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
index 8887017..90cbb2f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
@@ -58,12 +58,12 @@ public class ActionParameterValidationFacetViaMethodFactory extends MethodPrefix
         // in any case single-arg, either same as param-type or PPM style 
         
         val actionMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForParam(actionMethod, PREFIX));
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.TEXT)
-                .paramIndexToMethodName(namingConvention)
+                .paramIndexToMethodNameProviders(namingConvention)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SINGLEARG_BEING_PARAMTYPE))
                 .build();
         
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 2e7bb6b..30af672 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
@@ -23,7 +23,7 @@ import org.apache.isis.core.commons.collections.Can;
 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.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -54,16 +54,16 @@ public class PropertyAutoCompleteFacetMethodFactory extends MethodPrefixBasedFac
 
         val getterOrMixinMain = processMethodContext.getMethod();
         val namingConvention = processMethodContext.isMixinMain() 
-                ? PREFIX_BASED_NAMING.providerForAction(getterOrMixinMain, PREFIX)
-                : PREFIX_BASED_NAMING.providerForMember(getterOrMixinMain, PREFIX); // handles getters
+                ? PREFIX_BASED_NAMING.map(naming->naming.providerForAction(getterOrMixinMain, PREFIX))
+                : PREFIX_BASED_NAMING.map(naming->naming.providerForMember(getterOrMixinMain, PREFIX)); // handles getters
 
         
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
-        val autoCompleteMethod = MethodFinderUtils
+        val autoCompleteMethod = MethodFinder2
                 .findMethod(
                         cls, 
-                        namingConvention.get(), 
+                        namingConvention.map(x->x.get()), 
                         NO_RETURN, 
                         STRING_ARG);
         if (autoCompleteMethod == null) {
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 c703074..7f0ea43 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
@@ -23,7 +23,7 @@ import org.apache.isis.core.commons.collections.Can;
 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.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -52,16 +52,17 @@ public class PropertyChoicesFacetViaMethodFactory extends MethodPrefixBasedFacet
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
+        
         val namingConvention = processMethodContext.isMixinMain() 
-                ? PREFIX_BASED_NAMING.providerForAction(getterOrMixinMain, PREFIX)
-                : PREFIX_BASED_NAMING.providerForMember(getterOrMixinMain, PREFIX); // handles getters
+                ? PREFIX_BASED_NAMING.map(naming->naming.providerForAction(getterOrMixinMain, PREFIX))
+                : PREFIX_BASED_NAMING.map(naming->naming.providerForMember(getterOrMixinMain, PREFIX)); // handles getters
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
-        val choicesMethod = MethodFinderUtils
+        val choicesMethod = MethodFinder2
                 .findMethod(
                     cls, 
-                    namingConvention.get(), 
+                    namingConvention.map(x->x.get()), 
                     NO_RETURN, 
                     NO_ARG);
         if (choicesMethod == null) {
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 612d218..29f57dd 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
@@ -23,7 +23,7 @@ import org.apache.isis.core.commons.collections.Can;
 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.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -53,15 +53,15 @@ public class PropertyDefaultFacetViaMethodFactory extends MethodPrefixBasedFacet
 
         val getterOrMixinMain = processMethodContext.getMethod();
         val namingConvention = processMethodContext.isMixinMain() 
-                ? PREFIX_BASED_NAMING.providerForAction(getterOrMixinMain, PREFIX)
-                : PREFIX_BASED_NAMING.providerForMember(getterOrMixinMain, PREFIX); // handles getters
+                ? PREFIX_BASED_NAMING.map(naming->naming.providerForAction(getterOrMixinMain, PREFIX))
+                : PREFIX_BASED_NAMING.map(naming->naming.providerForMember(getterOrMixinMain, PREFIX)); // handles getters
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
-        val method = MethodFinderUtils
+        val method = MethodFinder2
                 .findMethod(
                     cls,
-                    namingConvention.get(), 
+                    namingConvention.map(x->x.get()), 
                     returnType, 
                     NO_ARG);
         if (method == null) {
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 c572db0..b074d7f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.properties.validating.method;
 
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodFinder2;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
@@ -45,12 +45,13 @@ public class PropertyValidateFacetViaMethodFactory extends MethodPrefixBasedFace
 
         val cls = processMethodContext.getCls();
         val getterMethod = processMethodContext.getMethod();
-        val namingConvention = PREFIX_BASED_NAMING.providerForMember(getterMethod, PREFIX);
+        
+        val namingConvention = PREFIX_BASED_NAMING.map(naming->naming.providerForMember(getterMethod, PREFIX));
         val returnType = getterMethod.getReturnType();
 
-        val validateMethod = MethodFinderUtils.findMethod_returningText(
+        val validateMethod = MethodFinder2.findMethod_returningText(
                 cls,
-                namingConvention.get(),
+                namingConvention.map(x->x.get()),
                 new Class[] { returnType });
         if (validateMethod == null) {
             return;
diff --git a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java
index 557193c..c88792e 100644
--- a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java
+++ b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java
@@ -50,8 +50,9 @@ public class InteractionNpmDemo_biArgDisabled {
     }
     
     //TODO[ISIS-2362] supporting methods (no arg): rename -> validate()
-    @Model
-    public String validateAct() {
+    //TODO[ISIS-2362] supporting methods (all args): rename -> validate(params)
+    //@Model //FIXME not recognized by method finders (metamodel)
+    public String validateAct(Parameters params) {
         return "Never valid for demonstration.";
     }
 }
diff --git a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java
index 8624a2c..cf88106 100644
--- a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java
+++ b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java
@@ -52,15 +52,19 @@ public class InteractionNpmDemo_biArgEnabled {
         return a + b;
     }
     
-    //TODO[ISIS-2362] parameter supporting methods, to be referenced by param name defaultA(...), choicesB(...) ...
-    
+    // -- PARAM 0
+
+    // [ISIS-2362] parameter supporting methods, to be referenced by param name
     @Model 
-    public int default0Act(Parameters params) {
+    public int defaultA(Parameters params) { 
         return 5;
     }
     
+    // -- PARAM 1
+    
+    // [ISIS-2362] parameter supporting methods, to be referenced by param name
     @Model
-    public int[] choices1Act(Parameters params) {
+    public int[] choicesB(Parameters params) {
         return new int[] {1, 2, 3, 4};
     }
 }
diff --git a/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java b/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
index e29c945..bfbf846 100644
--- a/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
+++ b/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
@@ -18,9 +18,11 @@
  */
 package org.apache.isis.testdomain.interact;
 
+import java.util.Collections;
 import java.util.NoSuchElementException;
 import java.util.stream.Collectors;
 
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
@@ -65,7 +67,16 @@ import lombok.val;
     IsisPresets.SilenceProgrammingModel
 })
 class NewParameterModelTest extends InteractionTestAbstract {
+    
+    //InteractionNpmDemo_biArgDisabled#validateAct()
 
+    
+    @Test// @Disabled("bug when processing ")
+    void metamodel_shouldBeValid() {
+        val specLoader = super.objectManager.getMetaModelContext().getSpecificationLoader(); 
+        assertEquals(Collections.<String>emptyList(), specLoader.getValidationResult().getMessages());
+    }
+    
     @Test
     void paramAnnotations_whenNpm_shouldBeRecognized() {
 
@@ -171,7 +182,7 @@ class NewParameterModelTest extends InteractionTestAbstract {
         
         assertTrue(param0Choices.getValue().isEmpty());
         
-        val expectedChoices = new InteractionNpmDemo_biArgEnabled(null).choices1Act(null);
+        val expectedChoices = new InteractionNpmDemo_biArgEnabled(null).choicesB(null);
         val actualChoices = param1Choices.getValue();
         
         assertComponentWiseUnwrappedEquals(expectedChoices, actualChoices);