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/05/06 11:53:40 UTC

[isis] branch master updated: ISIS-2361: supporting meth. shared naming convention (extract the algorithm to be reused)

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 9ac6571  ISIS-2361: supporting meth. shared naming convention (extract the algorithm to be reused)
9ac6571 is described below

commit 9ac657125d28039bbe21b4be3ef789b38e60de94
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed May 6 10:29:55 2020 +0200

    ISIS-2361: supporting meth. shared naming convention (extract the
    algorithm to be reused)
---
 .../core/metamodel/facets/MethodFinderUtils.java   | 10 +--
 .../metamodel/facets/MethodLiteralConstants.java   | 75 +++++++++++++++++++-
 .../MethodPrefixBasedFacetFactoryAbstract.java     |  6 +-
 .../ActionDefaultsFacetViaMethodFactory.java       | 36 ++++------
 .../ActionValidationFacetViaMethodFactory.java     | 67 ++++--------------
 .../DisableForContextFacetViaMethodFactory.java    | 34 ++++-----
 .../HideForContextFacetViaMethodFactory.java       | 39 ++++++-----
 .../method/ValidateObjectFacetMethodFactory.java   | 11 +--
 ...ParameterAutoCompleteFacetViaMethodFactory.java | 10 ++-
 .../method/ActionChoicesFacetViaMethodFactory.java | 40 ++++-------
 ...ctionParameterChoicesFacetViaMethodFactory.java | 19 ++---
 ...tionParameterDefaultsFacetViaMethodFactory.java | 15 ++--
 .../ActionParameterDisabledFacetViaMethod.java     |  6 +-
 ...tionParameterDisabledFacetViaMethodFactory.java | 23 +++---
 ...ActionParameterHiddenFacetViaMethodFactory.java | 15 ++--
 .../validate/ActionParameterValidationFacet.java   | 10 ++-
 .../ActionParameterValidationFacetAbstract.java    | 13 +++-
 .../ActionParameterValidationFacetViaMethod.java   | 28 ++++++--
 ...onParameterValidationFacetViaMethodFactory.java | 81 +++++++++++++---------
 .../PropertyAutoCompleteFacetMethodFactory.java    | 14 ++--
 .../PropertyChoicesFacetViaMethodFactory.java      | 13 ++--
 .../PropertyDefaultFacetViaMethodFactory.java      | 13 ++--
 .../PropertyValidateFacetViaMethodFactory.java     | 44 +++++-------
 .../interactions/ActionArgValidityContext.java     | 16 +++--
 .../actions/ActionMethodsFacetFactoryTest.java     |  4 +-
 ...pendentArgsActionDemo_useDefaultFixedPoint.java | 15 ++++
 26 files changed, 359 insertions(+), 298 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinderUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinderUtils.java
index dfce829..48b64ef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinderUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodFinderUtils.java
@@ -121,24 +121,24 @@ public final class MethodFinderUtils {
     }
     
     public static Optional<Method> findNoArgMethod(final Class<?> type, final String name, final Class<?> returnType) {
-        return streamMethods(type, name, returnType)
+        return streamMethods(type, Can.ofSingleton(name), returnType)
                 .filter(MethodUtil.Predicates.paramCount(0))
                 .findFirst();
     }
     
     public static Optional<Method> findSingleArgMethod(final Class<?> type, final String name, final Class<?> returnType) {
-        return streamMethods(type, name, returnType)
+        return streamMethods(type, Can.ofSingleton(name), returnType)
                 .filter(MethodUtil.Predicates.paramCount(1))
                 .findFirst();
     }
     
-    public static Stream<Method> streamMethods(final Class<?> type, final String name, final Class<?> returnType) {
+    public static Stream<Method> streamMethods(final Class<?> type, final Can<String> names, final Class<?> returnType) {
         try {
             final Method[] methods = type.getMethods();
             return Arrays.stream(methods)
                     .filter(MethodUtil::isPublic)
                     .filter(MethodUtil::isNotStatic)
-                    .filter(method -> method.getName().equals(name))
+                    .filter(method -> names.contains(method.getName()))
                     .filter(method -> returnType == null ||
                                       returnType.isAssignableFrom(method.getReturnType()))
                     ;
@@ -279,7 +279,7 @@ public final class MethodFinderUtils {
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
         
-        return streamMethods(type, name, returnType)
+        return streamMethods(type, Can.ofSingleton(name), returnType)
             .filter(MethodUtil.Predicates.paramCount(additionalParamTypes.size()+1))
             .filter(MethodUtil.Predicates.matchParamTypes(1, additionalParamTypes))
             .map(method->MethodAndPpmCandidate.of(method, method.getParameterTypes()[0]))
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 b1d3dd7..ff2f801 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
@@ -18,6 +18,13 @@
  */
 package org.apache.isis.core.metamodel.facets;
 
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.util.function.IntFunction;
+import java.util.function.Supplier;
+
+import org.apache.isis.core.metamodel.commons.StringExtensions;
+
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
@@ -35,7 +42,6 @@ public final class MethodLiteralConstants {
     public static final String AUTO_COMPLETE_PREFIX = "autoComplete";
 
     public static final String HIDE_PREFIX = "hide";
-
     public static final String DISABLE_PREFIX = "disable";
     public static final String VALIDATE_PREFIX = "validate";
     
@@ -64,6 +70,73 @@ public final class MethodLiteralConstants {
     public static final String ICON_NAME_PREFIX = "iconName";
     public static final String LAYOUT_METHOD_NAME = "layout";
     
+    // -- SUPPORTING METHOD NAMING CONVENTION
+    
+    public static enum SupportingMethodNamingConvention {
+
+        /** version 1.x classic eg. hideAct(...), hide0Act(...)*/
+        PREFIX_PARAMNUM_ACTION {
+
+            @Override
+            protected String getActionSupportingMethodName(Method actionMethod, String prefix) {
+                final String capitalizedName = 
+                        StringExtensions.asCapitalizedName(actionMethod.getName());
+                return prefix + capitalizedName;
+            }
+
+            @Override
+            protected String getParameterSupportingMethodName(Method actionMethod, String prefix, int paramNum) {
+                final String capitalizedName = 
+                        StringExtensions.asCapitalizedName(actionMethod.getName());
+                return prefix + paramNum + capitalizedName;
+            }
+            
+            @Override
+            protected String getMemberSupportingMethodName(Member member, String prefix) {
+                if(member instanceof Method) {
+                    final Method method = (Method)member;
+                    if(method.getParameterCount()>0) {
+                        // definitely an action not a getter
+                        return getActionSupportingMethodName(method, prefix);
+                    }
+                    // either a no-arg action or a getter 
+                    final String capitalizedName = 
+                            StringExtensions.asJavaBaseNameStripAccessorPrefixIfRequired(member.getName());
+                    return prefix + capitalizedName;
+                }
+                // must be a field then 
+                final String capitalizedName = 
+                        StringExtensions.asCapitalizedName(member.getName());
+                return prefix + capitalizedName;
+            }
+            
+        }
+        ;
+        
+        protected abstract String getActionSupportingMethodName(Method actionMethod, String prefix);
+        protected abstract String getParameterSupportingMethodName(Method actionMethod, String prefix, int paramNum);
+        /** automatically deals with properties getters and actions */
+        protected abstract String getMemberSupportingMethodName(Member member, String prefix);
+
+        /** paramNum to param-supporting-method name provider */
+        public IntFunction<String> providerForParam(Method actionMethod, String prefix) {
+            return paramNum->getParameterSupportingMethodName(
+                    actionMethod, prefix, paramNum);
+        }
+        
+        /** action-supporting-method name provider */
+        public Supplier<String> providerForAction(Method actionMethod, String prefix) {
+            return ()->getActionSupportingMethodName(actionMethod, prefix);
+        }
+        
+        /** member-supporting-method name provider */
+        public Supplier<String> providerForMember(Member member, String prefix) {
+            return ()->getMemberSupportingMethodName(member, prefix);
+        }
+        
+    }
+     
+    
     // -- DEPRECATIONS
     
     @Deprecated public static final String VALIDATE_ADD_TO_PREFIX = "validateAddTo";
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 cd6cd0e..d5302ef 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
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.MethodLiteralConstants.SupportingMethodNamingConvention;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -34,7 +35,10 @@ import lombok.val;
 public abstract class MethodPrefixBasedFacetFactoryAbstract
 extends FacetFactoryAbstract
 implements MethodPrefixBasedFacetFactory {
-
+    
+    protected static final SupportingMethodNamingConvention PREFIX_BASED_NAMING = 
+            SupportingMethodNamingConvention.PREFIX_PARAMNUM_ACTION;
+    
     @Getter(onMethod = @__(@Override))
     private final Can<String> prefixes;
 
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 e2f0b99..90b331e 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
@@ -24,33 +24,25 @@ 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.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-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.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
+import lombok.val;
+
 /**
  * Sets up all the {@link Facet}s for an action in a single shot.
  */
 public class ActionDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.DEFAULT_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.DEFAULT_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public ActionDefaultsFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
@@ -70,19 +62,19 @@ public class ActionDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetF
 
         processMethodContext.removeMethod(defaultsMethod);
 
-        final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
-        final ActionDefaultsFacetViaMethod facet = new ActionDefaultsFacetViaMethod(defaultsMethod, facetedMethod);
-        super.addFacet(facet);
+        val facetedMethod = processMethodContext.getFacetHolder();
+        super.addFacet(new ActionDefaultsFacetViaMethod(defaultsMethod, facetedMethod));
     }
 
-    private static Method findDefaultsMethodReturning(final ProcessMethodContext processMethodContext, final Class<?> returnType) {
-
-        final Method actionMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
-        final String name = MethodLiteralConstants.DEFAULT_PREFIX + capitalizedName;
+    private static Method findDefaultsMethodReturning(
+            final ProcessMethodContext processMethodContext, 
+            final Class<?> returnType) {
 
-        final Class<?> cls = processMethodContext.getCls();
-        return MethodFinderUtils.findMethod(cls, name, returnType, _Constants.emptyClasses);
+        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);
     }
 
 }
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 a8e4a7c..cfd2e60 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
@@ -23,10 +23,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.commons.StringExtensions;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 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.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
@@ -35,25 +32,17 @@ import org.apache.isis.core.metamodel.facets.actions.validate.ActionValidationFa
 import lombok.val;
 
 /**
- * Sets up {@link ActionValidationFacet}.
+ * Sets up {@link ActionValidationFacet} and {@link ActionParameterValidationFacetViaMethod}.
  */
-public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract  {
+public class ActionValidationFacetViaMethodFactory 
+extends MethodPrefixBasedFacetFactoryAbstract  {
+    
+    private static final String PREFIX = MethodLiteralConstants.VALIDATE_PREFIX;
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.VALIDATE_PREFIX);
-
-
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public ActionValidationFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         handleValidateAllArgsMethod(processMethodContext);
@@ -61,16 +50,17 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
 
     private void handleValidateAllArgsMethod(final ProcessMethodContext processMethodContext) {
 
-        final Class<?> cls = processMethodContext.getCls();
-        final Method actionMethod = processMethodContext.getMethod();
-        final IdentifiedHolder facetHolder = processMethodContext.getFacetHolder();
+        val cls = processMethodContext.getCls();
+        val actionMethod = processMethodContext.getMethod();
+        val facetHolder = processMethodContext.getFacetHolder();
 
-        final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
-        final Class<?>[] paramTypes = actionMethod.getParameterTypes();
+        val paramTypes = actionMethod.getParameterTypes();
 
+        val namingConvention = PREFIX_BASED_NAMING.providerForAction(actionMethod, PREFIX);
+        
         final Method validateMethod = MethodFinderUtils.findMethod_returningText(
                 cls,
-                MethodLiteralConstants.VALIDATE_PREFIX + capitalizedName,
+                namingConvention.get(),
                 paramTypes);
         if (validateMethod == null) {
             return;
@@ -80,38 +70,11 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
         final TranslationService translationService = getTranslationService();
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
-        final ActionValidationFacetViaMethod facet = new ActionValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
+        final ActionValidationFacetViaMethod facet = 
+                new ActionValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
         super.addFacet(facet);
     }
 
-    @Override
-    public void processParams(final ProcessParameterContext processParameterContext) {
-
-        final Class<?> cls = processParameterContext.getCls();
-        final Method actionMethod = processParameterContext.getMethod();
-        final int paramNum = processParameterContext.getParamNum();
-        val paramType = processParameterContext.getParameterType();
-        final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
-
-        final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
-
-        final String validateName = MethodLiteralConstants.VALIDATE_PREFIX + paramNum + capitalizedName;
-        final Method validateMethod = MethodFinderUtils.findMethod_returningText(
-                cls,
-                validateName,
-                new Class<?>[]{paramType});
-        if (validateMethod == null) {
-            return;
-        }
-
-        processParameterContext.removeMethod(validateMethod);
-
-        final TranslationService translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
-        final Facet facet = new ActionParameterValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
-        super.addFacet(facet);
-    }
 
 
 }
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 f7659b1..5da2fb2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
@@ -23,8 +23,6 @@ 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.commons.StringExtensions;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
@@ -32,22 +30,17 @@ import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
-public class DisableForContextFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract  {
+import lombok.val;
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.DISABLE_PREFIX);
+public class DisableForContextFacetViaMethodFactory 
+extends MethodPrefixBasedFacetFactoryAbstract  {
+
+    private static final String PREFIX = MethodLiteralConstants.DISABLE_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public DisableForContextFacetViaMethodFactory() {
-        super(FeatureType.MEMBERS, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.MEMBERS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         attachDisabledFacetIfDisabledMethodIsFound(processMethodContext);
@@ -55,12 +48,13 @@ public class DisableForContextFacetViaMethodFactory extends MethodPrefixBasedFac
 
     private void attachDisabledFacetIfDisabledMethodIsFound(final ProcessMethodContext processMethodContext) {
 
-        final Method method = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asJavaBaseNameStripAccessorPrefixIfRequired(method.getName());
+        val actionOrGetter = processMethodContext.getMethod();
 
-        final Class<?> cls = processMethodContext.getCls();
+        val cls = processMethodContext.getCls();
 
         Method disableMethod = null;
+        
+        val namingConvention = PREFIX_BASED_NAMING.providerForMember(actionOrGetter, PREFIX);
 
         boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
         boolean searchExactMatch = !noParamsOnly;
@@ -68,15 +62,15 @@ public class DisableForContextFacetViaMethodFactory extends MethodPrefixBasedFac
             // search for exact match
             disableMethod = MethodFinderUtils.findMethod_returningText(
                     cls,
-                    MethodLiteralConstants.DISABLE_PREFIX + capitalizedName,
-                    method.getParameterTypes());
+                    namingConvention.get(),
+                    actionOrGetter.getParameterTypes());
         }
         if (disableMethod == null) {
             // search for no-arg version
             disableMethod = MethodFinderUtils.findMethod_returningText(
                     cls,
-                    MethodLiteralConstants.DISABLE_PREFIX + capitalizedName,
-                    new Class<?>[0]);
+                    namingConvention.get(),
+                    NO_ARG);
         }
         if (disableMethod == null) {
             return;
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 45b08db..d1178db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
@@ -22,8 +22,6 @@ package org.apache.isis.core.metamodel.facets.members.hidden.method;
 import java.lang.reflect.Method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -31,22 +29,17 @@ import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
-public class HideForContextFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
+import lombok.val;
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.HIDE_PREFIX);
+public class HideForContextFacetViaMethodFactory 
+extends MethodPrefixBasedFacetFactoryAbstract {
+
+    private static final String PREFIX = MethodLiteralConstants.HIDE_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public HideForContextFacetViaMethodFactory() {
-        super(FeatureType.MEMBERS, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.MEMBERS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         attachHideFacetIfHideMethodIsFound(processMethodContext);
@@ -54,18 +47,26 @@ public class HideForContextFacetViaMethodFactory extends MethodPrefixBasedFacetF
 
     private void attachHideFacetIfHideMethodIsFound(final ProcessMethodContext processMethodContext) {
 
-        final Method getter = processMethodContext.getMethod();
-        final String capitalizedName = 
-                StringExtensions.asJavaBaseNameStripAccessorPrefixIfRequired(getter.getName());
+        final Method actionOrGetter = processMethodContext.getMethod();
+        
+        val namingConvention = PREFIX_BASED_NAMING.providerForMember(actionOrGetter, PREFIX);
         
-        final Class<?> cls = processMethodContext.getCls();
-        Method hideMethod = MethodFinderUtils.findMethod(cls, MethodLiteralConstants.HIDE_PREFIX + capitalizedName, boolean.class, new Class[] {});
+        val cls = processMethodContext.getCls();
+        Method hideMethod = MethodFinderUtils.findMethod(
+                cls, 
+                namingConvention.get(), 
+                boolean.class, 
+                NO_ARG);
         if (hideMethod == null) {
 
             boolean noParamsOnly = getConfiguration().getCore().getMetaModel().getValidator().isNoParamsOnly();
             boolean searchExactMatch = !noParamsOnly;
             if(searchExactMatch) {
-                hideMethod = MethodFinderUtils.findMethod(cls, MethodLiteralConstants.HIDE_PREFIX + capitalizedName, boolean.class, getter.getParameterTypes());
+                hideMethod = MethodFinderUtils.findMethod(
+                        cls, 
+                        namingConvention.get(), 
+                        boolean.class, 
+                        actionOrGetter.getParameterTypes());
             }
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java
index ca201b4..759e8a6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/validateobject/method/ValidateObjectFacetMethodFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.facets.object.validating.validateobject.m
 
 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.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -31,12 +30,14 @@ import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
+import lombok.val;
+
 public class ValidateObjectFacetMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.VALIDATE_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.VALIDATE_PREFIX;
 
     public ValidateObjectFacetMethodFactory() {
-        super(FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -49,9 +50,9 @@ public class ValidateObjectFacetMethodFactory extends MethodPrefixBasedFacetFact
                 MethodLiteralConstants.VALIDATE_PREFIX,
                 NO_ARG);
         if (method != null) {
-            final TranslationService translationService = getTranslationService();
+            val translationService = getTranslationService();
             // sadness: same as in TranslationFactory
-            final String translationContext = ((IdentifiedHolder)facetHolder).getIdentifier().toClassIdentityString();
+            val translationContext = ((IdentifiedHolder)facetHolder).getIdentifier().toClassIdentityString();
             FacetUtil.addFacet(new ValidateObjectFacetMethod(method, translationService, translationContext, facetHolder));
             processClassContext.removeMethod(method);
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index f5cba6c..fb1c2db 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
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.param.autocomplete.method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
@@ -33,10 +32,10 @@ import lombok.val;
 
 public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.AUTO_COMPLETE_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.AUTO_COMPLETE_PREFIX;
 
     public ActionParameterAutoCompleteFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -52,14 +51,13 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
         // attach ActionParameterChoicesFacet if autoCompleteNumMethod is found ...
         
         val actionMethod = processMethodContext.getMethod();
-        val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.NON_SCALAR)
                 .additionalParamType(String.class)
-                .paramIndexToMethodName(paramIndex -> 
-                    MethodLiteralConstants.AUTO_COMPLETE_PREFIX + paramIndex + capitalizedName)
+                .paramIndexToMethodName(namingConvention)
                 .build();
 
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
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 02e130d..6698a28 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
@@ -23,31 +23,22 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.commons.internal._Constants;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 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.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
+import lombok.val;
+
 public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.CHOICES_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.CHOICES_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public ActionChoicesFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
         attachActionChoicesFacetIfParameterChoicesMethodIsFound(processMethodContext);
@@ -55,12 +46,12 @@ public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFa
 
     private void attachActionChoicesFacetIfParameterChoicesMethodIsFound(final ProcessMethodContext processMethodContext) {
 
-        final Method actionMethod = processMethodContext.getMethod();
+        val actionMethod = processMethodContext.getMethod();
 
         if (actionMethod.getParameterCount() <= 0) {
             return;
         }
-
+        
         Method choicesMethod = null;
         if (choicesMethod == null) {
             choicesMethod = findChoicesMethodReturning(processMethodContext, Object[][].class);
@@ -78,24 +69,21 @@ public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFa
 
         final Class<?> returnType = actionMethod.getReturnType();
         final FacetHolder action = processMethodContext.getFacetHolder();
-        final ActionChoicesFacetViaMethod facet = new ActionChoicesFacetViaMethod(choicesMethod, returnType, action);
         
-        super.addFacet(facet);
+        super.addFacet(new ActionChoicesFacetViaMethod(choicesMethod, returnType, action));
         
     }
 
     protected Method findChoicesMethodReturning(
             final ProcessMethodContext processMethodContext, 
-            final Class<?> returnType2) {
-        
-        Method choicesMethod;
-        final Class<?> cls = processMethodContext.getCls();
-
-        final Method actionMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+            final Class<?> returnType) {
 
-        final String name = MethodLiteralConstants.CHOICES_PREFIX + capitalizedName;
-        choicesMethod = MethodFinderUtils.findMethod(cls, name, returnType2, _Constants.emptyClasses);
+        val cls = processMethodContext.getCls();
+        val actionMethod = processMethodContext.getMethod();
+        val namingConvention = PREFIX_BASED_NAMING.providerForAction(actionMethod, PREFIX);
+        
+        Method choicesMethod = 
+                MethodFinderUtils.findMethod(cls, namingConvention.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 745af6b..4c83fc6 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
@@ -20,14 +20,12 @@
 package org.apache.isis.core.metamodel.facets.param.choices.methodnum;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.ParameterSupport;
-import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.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.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
 
 import lombok.val;
@@ -35,14 +33,10 @@ import lombok.val;
 public class ActionParameterChoicesFacetViaMethodFactory 
 extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.empty();
+    private static final String PREFIX = MethodLiteralConstants.CHOICES_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public ActionParameterChoicesFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     // ///////////////////////////////////////////////////////
@@ -62,13 +56,12 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         // attach ActionChoicesFacet if choicesNumMethod is found ...
 
         val actionMethod = processMethodContext.getMethod();
-        val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.NON_SCALAR)
-                .paramIndexToMethodName(paramIndex -> 
-                    MethodLiteralConstants.CHOICES_PREFIX + paramIndex + capitalizedName)
+                .paramIndexToMethodName(namingConvention)
                 .build();
 
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
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 04930ff..c69f4a9 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
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.param.defaults.methodnum;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -37,14 +36,10 @@ import lombok.val;
  */
 public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.empty();
+    private static final String PREFIX = MethodLiteralConstants.DEFAULT_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public ActionParameterDefaultsFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     // ///////////////////////////////////////////////////////
@@ -63,15 +58,13 @@ public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBa
 
         // attach DefaultFacetForParameters if defaultNumMethod is found ...
         
-        //val translationService = getMetaModelContext().getTranslationService();
         val actionMethod = processMethodContext.getMethod();
-        val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.SAME_AS_PARAMETER_TYPE)
-                .paramIndexToMethodName(paramIndex -> 
-                    MethodLiteralConstants.DEFAULT_PREFIX + paramIndex + capitalizedName)
+                .paramIndexToMethodName(namingConvention)
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
index 4e9c379..b63caff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
@@ -74,11 +74,11 @@ implements ImperativeFacet {
     @Override
     public String disabledReason(
             final ManagedObject owningAdapter, 
-            final Can<ManagedObject> argumentAdapters) {
+            final Can<ManagedObject> pendingArgs) {
         
         final Object returnValue = ppmFactory.isPresent()
-                ? ManagedObject.InvokeUtil.invokeWithPPM(ppmFactory.get(), method, owningAdapter, argumentAdapters)
-                : ManagedObject.InvokeUtil.invokeAutofit(method, owningAdapter, argumentAdapters);
+                ? ManagedObject.InvokeUtil.invokeWithPPM(ppmFactory.get(), method, owningAdapter, pendingArgs)
+                : ManagedObject.InvokeUtil.invokeAutofit(method, owningAdapter, pendingArgs);
                 
         if(returnValue instanceof String) {
             return (String) returnValue;
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 dedb6c5..9c4666b 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
@@ -20,13 +20,12 @@
 package org.apache.isis.core.metamodel.facets.param.disable.method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.ParameterSupport;
-import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.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.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacet;
 
 import lombok.val;
@@ -36,12 +35,11 @@ import lombok.val;
  */
 public class ActionParameterDisabledFacetViaMethodFactory 
 extends MethodPrefixBasedFacetFactoryAbstract  {
-
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.DISABLE_PREFIX);
+    
+    private static final String PREFIX = MethodLiteralConstants.DISABLE_PREFIX;
 
     public ActionParameterDisabledFacetViaMethodFactory() {
-        //super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -56,21 +54,19 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
 
         // attach ActionParameterDisabledFacet if disableNumMethod is found ...
         
-        val translationService = getMetaModelContext().getTranslationService();
         val actionMethod = processMethodContext.getMethod();
-        val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.TEXT)
-                .paramIndexToMethodName(paramIndex -> 
-                    MethodLiteralConstants.DISABLE_PREFIX + paramIndex + capitalizedName)
+                .paramIndexToMethodName(namingConvention)
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
             
             val disableMethod = searchResult.getSupportingMethod();
-            val paramIndex = searchResult.getParamIndex();
+            val paramNum = searchResult.getParamIndex();
             
             processMethodContext.removeMethod(disableMethod);
 
@@ -81,9 +77,10 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
             }
             
             // add facets directly to parameters, not to actions
-            val paramAsHolder = parameters.get(paramIndex);
+            val paramAsHolder = parameters.get(paramNum);
             val translationContext = paramAsHolder.getIdentifier().toFullIdentityString();
             val ppmFactory = searchResult.getPpmFactory();
+            val translationService = getMetaModelContext().getTranslationService();
             
             super.addFacet(
                     new ActionParameterDisabledFacetViaMethod(
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 9e1c4b3..16304d8 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
@@ -20,13 +20,12 @@
 package org.apache.isis.core.metamodel.facets.param.hide.method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.ParameterSupport;
-import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.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.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.param.hide.ActionParameterHiddenFacet;
 
 import lombok.val;
@@ -36,11 +35,10 @@ import lombok.val;
  */
 public class ActionParameterHiddenFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract  {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.HIDE_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.HIDE_PREFIX;
 
     public ActionParameterHiddenFacetViaMethodFactory() {
-        //super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -56,13 +54,12 @@ public class ActionParameterHiddenFacetViaMethodFactory extends MethodPrefixBase
         // attach ActionParameterHiddenFacet if hideNumMethod is found ...
         
         val actionMethod = processMethodContext.getMethod();
-        val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.BOOLEAN)
-                .paramIndexToMethodName(paramIndex -> 
-                    MethodLiteralConstants.HIDE_PREFIX + paramIndex + capitalizedName)
+                .paramIndexToMethodName(namingConvention)
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacet.java
index d2e1e5c..475abff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacet.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.param.validate;
 
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
@@ -37,10 +38,15 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
  * 
  * @see ActionInvocationFacet
  */
-public interface ActionParameterValidationFacet extends Facet, ValidatingInteractionAdvisor {
+public interface ActionParameterValidationFacet
+extends Facet, ValidatingInteractionAdvisor {
 
     /**
      * Reason why the validation has failed, or <tt>null</tt> if okay.
+     * @param can 
      */
-    public String invalidReason(ManagedObject target, ManagedObject arguments);
+    public String invalidReason(
+            ManagedObject target, 
+            Can<ManagedObject> pendingArgs, 
+            ManagedObject proposedArgument);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java
index d5f5c07..b18c365 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/ActionParameterValidationFacetAbstract.java
@@ -26,7 +26,11 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 
-public abstract class ActionParameterValidationFacetAbstract extends FacetAbstract implements ActionParameterValidationFacet {
+import lombok.val;
+
+public abstract class ActionParameterValidationFacetAbstract 
+extends FacetAbstract
+implements ActionParameterValidationFacet {
 
     public static Class<? extends Facet> type() {
         return ActionParameterValidationFacet.class;
@@ -41,7 +45,10 @@ public abstract class ActionParameterValidationFacetAbstract extends FacetAbstra
         if (!(context instanceof ActionArgValidityContext)) {
             return null;
         }
-        final ActionArgValidityContext actionArgValidityContext = (ActionArgValidityContext) context;
-        return invalidReason(actionArgValidityContext.getTarget(), actionArgValidityContext.getProposed());
+        val actionArgValidityContext = (ActionArgValidityContext) context;
+        return invalidReason(
+                actionArgValidityContext.getTarget(), 
+                actionArgValidityContext.getArgs(),
+                actionArgValidityContext.getProposed());
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
index 641f9ec..6e058fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -19,29 +19,42 @@
 
 package org.apache.isis.core.metamodel.facets.param.validate.method;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public class ActionParameterValidationFacetViaMethod extends ActionParameterValidationFacetAbstract implements ImperativeFacet {
+public class ActionParameterValidationFacetViaMethod 
+extends ActionParameterValidationFacetAbstract 
+implements ImperativeFacet {
 
     private final Method method;
     private final TranslationService translationService;
     private final String translationContext;
+    private final Optional<Constructor<?>> ppmFactory;
 
-    public ActionParameterValidationFacetViaMethod(final Method method, final TranslationService translationService, final String translationContext, final FacetHolder holder) {
+    public ActionParameterValidationFacetViaMethod(
+            final Method method, 
+            final TranslationService translationService, 
+            final String translationContext, 
+            final Optional<Constructor<?>> ppmFactory, 
+            final FacetHolder holder) {
+        
         super(holder);
         this.method = method;
         this.translationService = translationService;
         this.translationContext = translationContext;
+        this.ppmFactory = ppmFactory;
     }
 
     /**
@@ -59,8 +72,15 @@ public class ActionParameterValidationFacetViaMethod extends ActionParameterVali
     }
 
     @Override
-    public String invalidReason(final ManagedObject owningAdapter, final ManagedObject proposedArgumentAdapter) {
-        final Object returnValue = ManagedObject.InvokeUtil.invoke(method, owningAdapter, proposedArgumentAdapter);
+    public String invalidReason(
+            final ManagedObject owningAdapter, 
+            final Can<ManagedObject> pendingArgs, 
+            final ManagedObject proposedArgument) {
+        
+        final Object returnValue = ppmFactory.isPresent()
+                ? ManagedObject.InvokeUtil.invokeWithPPM(ppmFactory.get(), method, owningAdapter, pendingArgs)
+                : ManagedObject.InvokeUtil.invoke(method, owningAdapter, proposedArgument);
+        
         if(returnValue instanceof String) {
             return (String) returnValue;
         }
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 e33989a..a3bebb4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
@@ -24,59 +24,78 @@ 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.commons.StringExtensions;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 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.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.ParameterSupport;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
+import org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacet;
+import org.apache.isis.core.metamodel.facets.param.disable.method.ActionParameterDisabledFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacet;
 
 import lombok.val;
 
 /**
- * Sets up {@link ActionParameterValidationFacet}.
- */
+ * Sets up {@link ActionParameterValidationFacet}. */
 public class ActionParameterValidationFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract  {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.VALIDATE_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.VALIDATE_PREFIX;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
     public ActionParameterValidationFacetViaMethodFactory() {
-        super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
 
     @Override
-    public void processParams(final ProcessParameterContext processParameterContext) {
-
-        val cls = processParameterContext.getCls();
-        val actionMethod = processParameterContext.getMethod();
-        final int paramNum = processParameterContext.getParamNum();
-        val paramType = processParameterContext.getParameterType();
-        final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
-
-        final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
-
-        final String validateName = MethodLiteralConstants.VALIDATE_PREFIX + paramNum + capitalizedName;
-        final Method validateMethod = MethodFinderUtils.findMethod_returningText(
-                cls,
-                validateName,
-                new Class<?>[]{paramType});
-        if (validateMethod == null) {
+    public void process(final ProcessMethodContext processMethodContext) {
+
+        val facetedMethod = processMethodContext.getFacetHolder();
+        val parameters = facetedMethod.getParameters();
+
+        if (parameters.isEmpty()) {
             return;
         }
 
-        processParameterContext.removeMethod(validateMethod);
-
-        final TranslationService translationService = getMetaModelContext().getTranslationService();
-        // sadness: same as in TranslationFactory
-        final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
-        final Facet facet = new ActionParameterValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
-        super.addFacet(facet);
+        // attach ActionParameterValidationFacet if validateNumMethod is found ...
+        
+        val actionMethod = processMethodContext.getMethod();
+        val namingConvention = PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
+
+        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
+                .processMethodContext(processMethodContext)
+                .returnType(ReturnType.TEXT)
+                .paramIndexToMethodName(namingConvention)
+                .build();
+        
+        ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
+        
+            val validateMethod = searchResult.getSupportingMethod();
+            val paramNum = searchResult.getParamIndex();
+            
+            processMethodContext.removeMethod(validateMethod);
+            
+            if (facetedMethod.containsNonFallbackFacet(ActionParameterValidationFacet.class)) {
+                val cls = processMethodContext.getCls();
+                throw new MetaModelException(cls + " uses both old and new 'validate' syntax - "
+                        + "must use one or other");
+            }
+            
+            // add facets directly to parameters, not to actions
+            val paramAsHolder = parameters.get(paramNum);
+            val translationContext = paramAsHolder.getIdentifier().toFullIdentityString();
+            val ppmFactory = searchResult.getPpmFactory();
+            val translationService = getMetaModelContext().getTranslationService();
+
+            super.addFacet(
+                    new ActionParameterValidationFacetViaMethod(
+                            validateMethod, translationService, translationContext, ppmFactory, paramAsHolder));
+        
+        });
     }
 
 
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 606635f..2e7bb6b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.properties.autocomplete.method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -32,11 +31,11 @@ import lombok.val;
 
 public class PropertyAutoCompleteFacetMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.AUTO_COMPLETE_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.AUTO_COMPLETE_PREFIX;
 
     public PropertyAutoCompleteFacetMethodFactory() {
         // to also support properties from mixins, need to not only include properties but also actions
-        super(FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -54,16 +53,17 @@ public class PropertyAutoCompleteFacetMethodFactory extends MethodPrefixBasedFac
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val capitalizedName = processMethodContext.isMixinMain() 
-                ? StringExtensions.asCapitalizedName(getterOrMixinMain.getName())
-                        : StringExtensions.asJavaBaseName(getterOrMixinMain.getName());
+        val namingConvention = processMethodContext.isMixinMain() 
+                ? PREFIX_BASED_NAMING.providerForAction(getterOrMixinMain, PREFIX)
+                : PREFIX_BASED_NAMING.providerForMember(getterOrMixinMain, PREFIX); // handles getters
+
         
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
         val autoCompleteMethod = MethodFinderUtils
                 .findMethod(
                         cls, 
-                        MethodLiteralConstants.AUTO_COMPLETE_PREFIX + capitalizedName, 
+                        namingConvention.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 7c61a25..c703074 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.properties.choices.method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -32,11 +31,11 @@ import lombok.val;
 
 public class PropertyChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.CHOICES_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.CHOICES_PREFIX;
 
     public PropertyChoicesFacetViaMethodFactory() {
      // to also support properties from mixins, need to not only include properties but also actions
-        super(FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -53,16 +52,16 @@ public class PropertyChoicesFacetViaMethodFactory extends MethodPrefixBasedFacet
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val capitalizedName = processMethodContext.isMixinMain() 
-                ? StringExtensions.asCapitalizedName(getterOrMixinMain.getName())
-                        : StringExtensions.asJavaBaseName(getterOrMixinMain.getName());
+        val namingConvention = processMethodContext.isMixinMain() 
+                ? PREFIX_BASED_NAMING.providerForAction(getterOrMixinMain, PREFIX)
+                : PREFIX_BASED_NAMING.providerForMember(getterOrMixinMain, PREFIX); // handles getters
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
         val choicesMethod = MethodFinderUtils
                 .findMethod(
                     cls, 
-                    MethodLiteralConstants.CHOICES_PREFIX + capitalizedName, 
+                    namingConvention.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 35e5e1a..612d218 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.properties.defaults.method;
 
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -32,11 +31,11 @@ import lombok.val;
 
 public class PropertyDefaultFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.DEFAULT_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.DEFAULT_PREFIX;
 
     public PropertyDefaultFacetViaMethodFactory() {
      // to also support properties from mixins, need to not only include properties but also actions
-        super(FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.PROPERTIES_AND_ACTIONS, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -53,16 +52,16 @@ public class PropertyDefaultFacetViaMethodFactory extends MethodPrefixBasedFacet
         }
 
         val getterOrMixinMain = processMethodContext.getMethod();
-        val capitalizedName = processMethodContext.isMixinMain() 
-                ? StringExtensions.asCapitalizedName(getterOrMixinMain.getName())
-                        : StringExtensions.asJavaBaseName(getterOrMixinMain.getName());
+        val namingConvention = processMethodContext.isMixinMain() 
+                ? PREFIX_BASED_NAMING.providerForAction(getterOrMixinMain, PREFIX)
+                : PREFIX_BASED_NAMING.providerForMember(getterOrMixinMain, PREFIX); // handles getters
 
         val cls = processMethodContext.getCls();
         val returnType = getterOrMixinMain.getReturnType();
         val method = MethodFinderUtils
                 .findMethod(
                     cls,
-                    MethodLiteralConstants.DEFAULT_PREFIX + capitalizedName, 
+                    namingConvention.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 b2c2426..c572db0 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
@@ -19,24 +19,20 @@
 
 package org.apache.isis.core.metamodel.facets.properties.validating.method;
 
-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.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 
-import static org.apache.isis.core.metamodel.facets.MethodLiteralConstants.VALIDATE_PREFIX;
+import lombok.val;
 
 public class PropertyValidateFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract  {
 
-    private static final Can<String> PREFIXES = Can.ofSingleton(VALIDATE_PREFIX);
+    private static final String PREFIX = MethodLiteralConstants.VALIDATE_PREFIX;
 
     public PropertyValidateFacetViaMethodFactory() {
-        super(FeatureType.PROPERTIES_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.PROPERTIES_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
     }
 
     @Override
@@ -47,29 +43,27 @@ public class PropertyValidateFacetViaMethodFactory extends MethodPrefixBasedFace
 
     private void attachValidateFacetIfValidateMethodIsFound(final ProcessMethodContext processMethodContext) {
 
-        final Method getMethod = processMethodContext.getMethod();
-        final String capitalizedName = StringExtensions.asJavaBaseName(getMethod.getName());
-
-        final Class<?> returnType = getMethod.getReturnType();
-        final Class<?>[] paramTypes = new Class[] { returnType };
+        val cls = processMethodContext.getCls();
+        val getterMethod = processMethodContext.getMethod();
+        val namingConvention = PREFIX_BASED_NAMING.providerForMember(getterMethod, PREFIX);
+        val returnType = getterMethod.getReturnType();
 
-        final Class<?> cls = processMethodContext.getCls();
-        final Method method = MethodFinderUtils.findMethod_returningText(
+        val validateMethod = MethodFinderUtils.findMethod_returningText(
                 cls,
-                VALIDATE_PREFIX + capitalizedName,
-                paramTypes);
-        if (method == null) {
+                namingConvention.get(),
+                new Class[] { returnType });
+        if (validateMethod == null) {
             return;
         }
-        processMethodContext.removeMethod(method);
-
-        final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
+        processMethodContext.removeMethod(validateMethod);
 
-        final TranslationService translationService = getTranslationService();
+        val facetHolder = processMethodContext.getFacetHolder();
+        val translationService = getTranslationService();
         // sadness: same as in TranslationFactory
-        final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
-        final PropertyValidateFacetViaMethod facet = new PropertyValidateFacetViaMethod(method, translationService, translationContext, facetHolder);
-        super.addFacet(facet);
+        val translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
+        super.addFacet(
+                new PropertyValidateFacetViaMethod(
+                        validateMethod, translationService, translationContext, facetHolder));
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
index a4769c4..d819227 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgValidityContext.java
@@ -35,10 +35,12 @@ import lombok.Getter;
  * See {@link InteractionContext} for overview; analogous to
  * {@link ActionArgumentEvent}.
  */
-public class ActionArgValidityContext extends ValidityContext<ActionArgumentEvent> implements ProposedHolder, ActionInteractionContext {
+public class ActionArgValidityContext 
+extends ValidityContext<ActionArgumentEvent> 
+implements ProposedHolder, ActionInteractionContext {
 
     @Getter(onMethod = @__(@Override)) private final ObjectAction objectAction;
-    @Getter(onMethod = @__(@Override)) private final ManagedObject proposed;
+    @Getter(onMethod = @__(@Override)) private final ManagedObject proposed; 
     @Getter private final Can<ManagedObject> args;
     @Getter private final int position;
 
@@ -50,7 +52,10 @@ public class ActionArgValidityContext extends ValidityContext<ActionArgumentEven
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
-        super(InteractionContextType.ACTION_PROPOSED_ARGUMENT, targetAdapter, id, interactionInitiatedBy);
+        super(InteractionContextType.ACTION_PROPOSED_ARGUMENT, 
+                targetAdapter, 
+                id, 
+                interactionInitiatedBy);
         this.objectAction = objectAction;
 
         this.args = args;
@@ -61,7 +66,10 @@ public class ActionArgValidityContext extends ValidityContext<ActionArgumentEven
     @Override
     public ActionArgumentEvent createInteractionEvent() {
         return new ActionArgumentEvent(
-                unwrapSingle(getTarget()), getIdentifier(), ManagedObject.unwrapMultipleAsArray(getArgs().toList()), getPosition());
+                unwrapSingle(getTarget()), 
+                getIdentifier(), 
+                ManagedObject.unwrapMultipleAsArray(getArgs().toList()), 
+                getPosition());
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index 5ed1492..c409a23 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -131,12 +131,12 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
 
+        @SuppressWarnings("unused")
         class Customer {
-            @SuppressWarnings("unused")
+            
             public void someAction() {
             }
 
-            @SuppressWarnings("unused")
             public String validateSomeAction() {
                 return null;
             }
diff --git a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java
index e535e9e..6fccb64 100644
--- a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java
+++ b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDefaultFixedPoint.java
@@ -92,6 +92,11 @@ public class DependentArgsActionDemo_useDefaultFixedPoint {
     
     // -- PARAM 2
     
+    @Model
+    public int[] choices2Act(Parameters params) {
+        return new int[] {1,2,3,4};
+    }
+    
 //    @Model
 //    public int default2Act(Parameters params) {
 //        _Probe.sysOut("p2: %d %d %d %d", params.a, params.b, params.c, params.d);
@@ -105,6 +110,16 @@ public class DependentArgsActionDemo_useDefaultFixedPoint {
         _Probe.sysOut("p3: %d %d %d %d", params.a, params.b, params.c, params.d);
         return params.c() + 1;
     }
+    
+    @Model
+    public String validate3Act(Parameters params) {
+        
+        int cPlusD = params.c()+params.d();
+        
+        return (cPlusD%2 == 1)
+                ? "c plus d must be even"
+                : null;
+    }