You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/09/08 10:31:48 UTC

[isis] branch master updated: ISIS-2774: method finder overhaul (2)

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 035ccc3  ISIS-2774: method finder overhaul (2)
035ccc3 is described below

commit 035ccc3f6ba4dc40c87845704f1906247796cb9b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 8 12:31:40 2021 +0200

    ISIS-2774: method finder overhaul (2)
---
 .../isis/core/metamodel/facets/ActionSupport.java  | 16 ++---
 .../facets/HasPostConstructMethodCache.java        | 58 +++++++++++++++++
 .../core/metamodel/facets/ParameterSupport.java    | 48 +++++++-------
 .../metamodel/facets/PostConstructMethodCache.java | 29 ---------
 .../DescribedAsFacetForMemberViaMethodFactory.java |  5 +-
 .../DisableForContextFacetViaMethodFactory.java    |  5 +-
 .../HideForContextFacetViaMethodFactory.java       |  5 +-
 .../NamedFacetForMemberViaMethodFactory.java       |  5 +-
 .../object/callbacks/CallbackFacetFactory.java     |  3 +-
 .../choices/enums/EnumValueSemanticsProvider.java  |  2 +-
 .../DomainObjectAnnotationFacetFactory.java        | 18 ++----
 ...atableObjectFacetForDomainObjectAnnotation.java |  6 +-
 .../RecreatableObjectFacetAbstract.java            |  8 +--
 ...ObjectFacetDeclarativeInitializingAbstract.java |  4 +-
 .../recreatable/RecreatableObjectFacetFactory.java | 22 ++-----
 ...ctFacetForRecreatableDomainObjectInterface.java |  4 +-
 ...eObjectFacetForRecreatableObjectAnnotation.java |  4 +-
 ...leObjectFacetForRecreatableObjectInterface.java |  4 +-
 ...ableObjectFacetForXmlRootElementAnnotation.java |  4 +-
 .../object/support/ObjectSupportFacetFactory.java  |  7 +-
 .../PropertyAutoCompleteFacetMethodFactory.java    |  5 +-
 .../PropertyChoicesFacetViaMethodFactory.java      |  5 +-
 .../PropertyDefaultFacetViaMethodFactory.java      |  5 +-
 .../update/PropertySetterFacetFactory.java         |  3 +-
 .../PropertyValidateFacetViaMethodFactory.java     |  5 +-
 .../isis/core/metamodel/methods/MethodFinder.java  | 31 +++------
 .../metamodel/methods/MethodFinderOptions.java     | 64 ++++++++++++++++---
 .../core/metamodel/methods/MethodFinderUtils.java  | 74 ++++------------------
 .../metamodel/facets/MethodFinderUtilsTest.java    | 31 +++++----
 .../restfulobjects/viewer/mappers/FailureUtil.java |  4 +-
 30 files changed, 246 insertions(+), 238 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
index c763356..6e09bbc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
@@ -119,8 +119,8 @@ public final class ActionSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningBoolean(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramTypes, additionalParamTypes)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramTypes, additionalParamTypes)
                 .map(ActionSupport::toSearchResult)
                 .forEach(onMethodFound);
             break;
@@ -128,8 +128,8 @@ public final class ActionSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningText(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramTypes, additionalParamTypes)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramTypes, additionalParamTypes)
                 .map(ActionSupport::toSearchResult)
                 .forEach(onMethodFound);
             break;
@@ -170,8 +170,8 @@ public final class ActionSupport {
                 MethodFinder
                     .findMethod_returningBoolean(
                             MethodFinderOptions
-                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                            type, paramTypesToLookFor)
+                            .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                            paramTypesToLookFor)
                     .map(ActionSupport::toSearchResult)
                     .forEach(onMethodFound);
                 break;
@@ -179,8 +179,8 @@ public final class ActionSupport {
                 MethodFinder
                     .findMethod_returningText(
                             MethodFinderOptions
-                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                            type, paramTypesToLookFor)
+                            .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                            paramTypesToLookFor)
                     .map(ActionSupport::toSearchResult)
                     .forEach(onMethodFound);
                 break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/HasPostConstructMethodCache.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/HasPostConstructMethodCache.java
new file mode 100644
index 0000000..1812557
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/HasPostConstructMethodCache.java
@@ -0,0 +1,58 @@
+/*
+ *  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.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.isis.core.metamodel.methods.MethodByClassMap;
+import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
+
+import lombok.val;
+
+/**
+ * Contract between implementations of RecreatableObjectFacet and their creating facet factories.
+ */
+public interface HasPostConstructMethodCache {
+
+    MethodByClassMap getPostConstructMethodsCache();
+
+    default Method postConstructMethodFor(final Object pojo) {
+        return findAnnotatedMethod(
+                // @PostConstruct is allowed to appear on non-public methods
+                MethodFinderOptions.notNecessarilyPublic(pojo.getClass(), MethodFinderOptions.ANY_NAME)
+                .withRequiredReturnType(void.class),
+                PostConstruct.class,
+                getPostConstructMethodsCache());
+    }
+
+    private static Method findAnnotatedMethod(
+            final MethodFinderOptions options,
+            final Class<? extends Annotation> annotationClass,
+            final MethodByClassMap methods) {
+
+        val type = options.getCorrespondingClass();
+        return methods.computeIfAbsent(type, __->options.streamMethodsIgnoringSignature()
+                        .filter(method->method.getAnnotation(annotationClass)!=null)
+                        .findFirst()).orElse(null);
+    }
+
+}
\ No newline at end of file
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 762b30b..008835a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
@@ -136,8 +136,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningBoolean(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramTypes, additionalParamTypes)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -145,8 +145,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningText(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramTypes, additionalParamTypes)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -154,8 +154,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg_returningNonScalar(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramType, paramTypes, additionalParamTypes)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramType, paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -163,8 +163,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethodWithPPMArg(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramType, paramTypes, additionalParamTypes)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramType, paramTypes, additionalParamTypes)
                 .map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
                 .forEach(onMethodFound);
             break;
@@ -202,8 +202,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod_returningBoolean(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, singleArg)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -211,8 +211,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod_returningText(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, singleArg)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -220,8 +220,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod_returningNonScalar(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramType, singleArg)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramType, singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -229,8 +229,8 @@ public final class ParameterSupport {
             MethodFinder
                 .findMethod(
                         MethodFinderOptions
-                        .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                        type, paramType, singleArg)
+                        .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                        paramType, singleArg)
                 .map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
                 .forEach(onMethodFound);
             break;
@@ -267,8 +267,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod_returningBoolean(
                             MethodFinderOptions
-                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                            type, paramTypesToLookFor)
+                            .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                            paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
@@ -276,8 +276,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod_returningText(
                             MethodFinderOptions
-                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                            type, paramTypesToLookFor)
+                            .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                            paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
@@ -285,8 +285,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod_returningNonScalar(
                             MethodFinderOptions
-                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                            type, paramType, paramTypesToLookFor)
+                            .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                            paramType, paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
@@ -294,8 +294,8 @@ public final class ParameterSupport {
                 supportingMethod = MethodFinder
                     .findMethod(
                             MethodFinderOptions
-                            .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
-                            type, paramType, paramTypesToLookFor)
+                            .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+                            paramType, paramTypesToLookFor)
                     .findFirst()
                     .orElse(null);
                 break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PostConstructMethodCache.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PostConstructMethodCache.java
deleted file mode 100644
index 591d908..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PostConstructMethodCache.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets;
-
-import java.lang.reflect.Method;
-
-/**
- * Contract between implementations of RecreatableObjectFacet and their creating facet factories.
- */
-public interface PostConstructMethodCache {
-    Method postConstructMethodFor(final Object pojo);
-
-}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
index 039d8a0..5c10c31 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningText(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             NO_ARG)
         .peek(processMethodContext::removeMethod)
         .forEach(describedMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
index 68945e6..3189028 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract  {
          MethodFinder
          .findMethod_returningText(
              MethodFinderOptions
-             .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-             processMethodContext.getCls(),
+             .memberSupport(processMethodContext.getCls(),
+                     methodNameCandidates,
+                     processMethodContext.getIntrospectionPolicy()),
              NO_ARG)
          .peek(processMethodContext::removeMethod)
          .forEach(disableMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
index 24b9afd..08bc596 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             boolean.class,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
index 7139751..7427030 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningText(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             NO_ARG)
         .peek(processMethodContext::removeMethod)
         .forEach(namedMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
index 202d5ef..a20e5ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
@@ -69,9 +69,10 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         .findMethod(
                 MethodFinderOptions
                 .livecycleCallback(
+                        cls,
                         callbackMethodEnum.getMethodNames(),
                         processClassContext.getIntrospectionPolicy()),
-                cls, void.class, NO_ARG)
+                void.class, NO_ARG)
         .peek(processClassContext::removeMethod)
         .collect(Can.toCan());
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index c0e3d46..4f3e042 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -83,9 +83,9 @@ implements EnumFacet {
             .findMethod_returningText(
                     MethodFinderOptions
                         .objectSupport(
+                                getAdaptedClass(),
                                 ProgrammingModelConstants.ObjectSupportMethod.TITLE.getMethodNames(),
                                 introspectionPolicy),
-                    getAdaptedClass(),
                     null)
             .findFirst()
             .orElse(null);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 16db365..ade3a39 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.Identifier;
@@ -56,7 +55,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedLifecycleEventFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedLifecycleEventFacetForDomainObjectAnnotation;
@@ -78,8 +77,6 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.recreatable.Rec
 import org.apache.isis.core.metamodel.facets.object.mixin.MetaModelValidatorForMixinTypes;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelVisitingValidatorAbstract;
@@ -88,6 +85,7 @@ import org.apache.isis.core.metamodel.util.EventUtil;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -97,7 +95,7 @@ public class DomainObjectAnnotationFacetFactory
 extends FacetFactoryAbstract
 implements
     MetaModelRefiner,
-    PostConstructMethodCache,
+    HasPostConstructMethodCache,
     ObjectTypeFacetFactory {
 
     private final MetaModelValidatorForMixinTypes mixinTypeValidator =
@@ -640,15 +638,7 @@ implements
 
     // //////////////////////////////////////
 
+    @Getter(onMethod_ = {@Override})
     private final @NonNull MethodByClassMap postConstructMethodsCache;
 
-    @Override
-    public Method postConstructMethodFor(final Object pojo) {
-        return MethodFinderUtils.findAnnotatedMethod(
-                // @PostConstruct is allowed to appear on non-public methods
-                MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
-                pojo, PostConstruct.class, postConstructMethodsCache);
-    }
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index 0d86f8e..2f3ddb8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -24,7 +24,7 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetDeclarativeInitializingAbstract;
 
 public class RecreatableObjectFacetForDomainObjectAnnotation
@@ -33,7 +33,7 @@ extends RecreatableObjectFacetDeclarativeInitializingAbstract {
     public static Optional<RecreatableObjectFacetForDomainObjectAnnotation> create(
             final Optional<DomainObject> domainObjectIfAny,
             final FacetHolder holder,
-            final PostConstructMethodCache postConstructMethodCache,
+            final HasPostConstructMethodCache postConstructMethodCache,
             final Facet.Precedence precedence) {
 
         return domainObjectIfAny
@@ -58,7 +58,7 @@ extends RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     private RecreatableObjectFacetForDomainObjectAnnotation(
             final FacetHolder holder,
-            final PostConstructMethodCache postConstructMethodCache,
+            final HasPostConstructMethodCache postConstructMethodCache,
             final Facet.Precedence precedence) {
 
         super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache, precedence);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
index 829247b..0426954 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
@@ -27,7 +27,7 @@ import org.apache.isis.core.metamodel.commons.MethodExtensions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 
 import lombok.val;
@@ -36,7 +36,7 @@ public abstract class RecreatableObjectFacetAbstract
 extends FacetAbstract
 implements ViewModelFacet {
 
-    private final PostConstructMethodCache postConstructMethodCache;
+    private final HasPostConstructMethodCache postConstructMethodCache;
     private final ViewModelFacet.RecreationMechanism recreationMechanism;
 
     private static final Class<? extends Facet> type() {
@@ -46,7 +46,7 @@ implements ViewModelFacet {
     protected RecreatableObjectFacetAbstract(
             final FacetHolder holder,
             final RecreationMechanism recreationMechanism,
-            final PostConstructMethodCache postConstructMethodCache) {
+            final HasPostConstructMethodCache postConstructMethodCache) {
         super(type(), holder);
         this.postConstructMethodCache = postConstructMethodCache;
         this.recreationMechanism = recreationMechanism;
@@ -55,7 +55,7 @@ implements ViewModelFacet {
     protected RecreatableObjectFacetAbstract(
             final FacetHolder holder,
             final RecreationMechanism recreationMechanism,
-            final PostConstructMethodCache postConstructMethodCache,
+            final HasPostConstructMethodCache postConstructMethodCache,
             final Facet.Precedence precedence) {
         super(type(), holder, precedence);
         this.postConstructMethodCache = postConstructMethodCache;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
index dbc2526..348f20b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
@@ -24,7 +24,7 @@ import org.apache.isis.commons.internal.memento._Mementos.SerializingAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
@@ -37,7 +37,7 @@ extends RecreatableObjectFacetAbstract {
     public RecreatableObjectFacetDeclarativeInitializingAbstract(
             final FacetHolder holder,
             final RecreationMechanism recreationMechanism,
-            final PostConstructMethodCache postConstructMethodCache,
+            final HasPostConstructMethodCache postConstructMethodCache,
             final Facet.Precedence precedence) {
 
         super(holder, recreationMechanism, postConstructMethodCache, precedence);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
index f7c3ed6..44f6f9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
@@ -18,9 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.object.recreatable;
 
-import java.lang.reflect.Method;
-
-import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.xml.bind.annotation.XmlRootElement;
 
@@ -31,14 +28,13 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 
@@ -46,7 +42,7 @@ public class RecreatableObjectFacetFactory
 extends FacetFactoryAbstract
 implements
     MetaModelRefiner,
-    PostConstructMethodCache {
+    HasPostConstructMethodCache {
 
     @Inject
     public RecreatableObjectFacetFactory(
@@ -122,19 +118,9 @@ implements
         });
     }
 
-
     // //////////////////////////////////////
 
+    @Getter(onMethod_ = {@Override})
     private final @NonNull MethodByClassMap postConstructMethodsCache;
 
-    @Override
-    public Method postConstructMethodFor(final Object pojo) {
-        return MethodFinderUtils.findAnnotatedMethod(
-                // @PostConstruct is allowed to appear on non-public methods
-                MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
-                pojo, PostConstruct.class, postConstructMethodsCache);
-    }
-
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java
index a670616..530343f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java
@@ -20,14 +20,14 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
 
 import org.apache.isis.applib.RecreatableDomainObject;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 
 public class RecreatableObjectFacetForRecreatableDomainObjectInterface
 extends RecreatableObjectFacetAbstract {
 
     public RecreatableObjectFacetForRecreatableDomainObjectInterface(
             final FacetHolder holder,
-            final PostConstructMethodCache postConstructMethodCache) {
+            final HasPostConstructMethodCache postConstructMethodCache) {
         super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
index f1ef5f6..9ba6b07 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
@@ -19,14 +19,14 @@
 package org.apache.isis.core.metamodel.facets.object.recreatable;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 
 public class RecreatableObjectFacetForRecreatableObjectAnnotation
 extends RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     public RecreatableObjectFacetForRecreatableObjectAnnotation(
             final FacetHolder holder,
-            final PostConstructMethodCache postConstructMethodCache) {
+            final HasPostConstructMethodCache postConstructMethodCache) {
         super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache, Precedence.DEFAULT);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
index 861858b..3fedd86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
@@ -20,13 +20,13 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
 
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 
 public class RecreatableObjectFacetForRecreatableObjectInterface extends RecreatableObjectFacetAbstract {
 
     public RecreatableObjectFacetForRecreatableObjectInterface(
             final FacetHolder holder,
-            final PostConstructMethodCache postConstructMethodCache) {
+            final HasPostConstructMethodCache postConstructMethodCache) {
         super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
index 8ef221d..1b01e3b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
 
 public class RecreatableObjectFacetForXmlRootElementAnnotation
 extends RecreatableObjectFacetAbstract {
@@ -29,7 +29,7 @@ extends RecreatableObjectFacetAbstract {
 
     public RecreatableObjectFacetForXmlRootElementAnnotation(
             final FacetHolder holder,
-            final PostConstructMethodCache postConstructMethodCache) {
+            final HasPostConstructMethodCache postConstructMethodCache) {
 
         super(holder, RecreationMechanism.INSTANTIATES, postConstructMethodCache, Precedence.HIGH);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
index 08707ce..12a5e88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
@@ -114,9 +114,10 @@ extends MethodPrefixBasedFacetFactoryAbstract {
 
         MethodFinder
         .findMethod_returningCategory(
-                MethodFinderOptions.publicOnly(toString.getMethodNames()),
+                MethodFinderOptions.publicOnly(
+                        processClassContext.getCls(),
+                        toString.getMethodNames()),
                 toString.getReturnTypeCategory(),
-                processClassContext.getCls(),
                 NO_ARG)
         .peek(processClassContext::removeMethod)
         .forEach(method->{
@@ -135,10 +136,10 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         .findMethod_returningCategory(
                 MethodFinderOptions
                 .objectSupport(
+                        processClassContext.getCls(),
                         objectSupportMethodEnum.getMethodNames(),
                         processClassContext.getIntrospectionPolicy()),
                 objectSupportMethodEnum.getReturnTypeCategory(),
-                processClassContext.getCls(),
                 NO_ARG)
         .peek(processClassContext::removeMethod)
         .forEach(method->{
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 dcc9201..f72fc3e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningNonScalar(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             returnType,
             STRING_ARG)
         .peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
index 3562ac3..49fc907 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod_returningNonScalar(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             returnType,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
index 8930253..56940f2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
         MethodFinder
         .findMethod(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             returnType,
             NO_ARG)
         .peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
index 5b114d4..ed4fcb1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
@@ -66,9 +66,8 @@ extends MethodPrefixBasedFacetFactoryAbstract {
         val setterMethods = MethodFinder
         .findMethod_returningCategory(
                 MethodFinderOptions
-                .accessor(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
+                .accessor(processMethodContext.getCls(), methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
                 ReturnTypeCategory.VOID,
-                processMethodContext.getCls(),
                 paramTypes)
         .peek(processMethodContext::removeMethod)
         .collect(Can.toCan());
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 7d7bed0..f8c86b8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract  {
         MethodFinder
         .findMethod_returningText(
             MethodFinderOptions
-            .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
-            processMethodContext.getCls(),
+            .memberSupport(processMethodContext.getCls(),
+                    methodNameCandidates,
+                    processMethodContext.getIntrospectionPolicy()),
             new Class[] { returnType })
         .peek(processMethodContext::removeMethod)
         .forEach(validateMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
index 276cb08..9e2b2fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
@@ -44,11 +44,9 @@ public final class MethodFinder {
 
     public static Stream<Method> findMethod(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?> expectedReturnType,
             final Class<?>[] paramTypes) {
-
-        return options.streamMethods(type, paramTypes)
+        return options.streamMethodsMatchingSignature(paramTypes)
                 .filter(hasReturnType(expectedReturnType));
     }
 
@@ -57,36 +55,32 @@ public final class MethodFinder {
     public static Stream<Method> findMethod_returningCategory(
             final MethodFinderOptions options,
             final ReturnTypeCategory returnTypeCategory,
-            final Class<?> type,
             final Class<?>[] paramTypes) {
 
-        return options.streamMethods(type, paramTypes)
+        return options.streamMethodsMatchingSignature(paramTypes)
                 .filter(hasReturnTypeAnyOf(returnTypeCategory.getReturnTypes()));
     }
 
     public static Stream<Method> findMethod_returningBoolean(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?>[] paramTypes) {
 
-        return findMethod_returningCategory(options, ReturnTypeCategory.BOOLEAN, type, paramTypes);
+        return findMethod_returningCategory(options, ReturnTypeCategory.BOOLEAN, paramTypes);
     }
 
     public static Stream<Method> findMethod_returningText(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?>[] paramTypes) {
 
-        return findMethod_returningCategory(options, ReturnTypeCategory.TRANSLATABLE, type, paramTypes);
+        return findMethod_returningCategory(options, ReturnTypeCategory.TRANSLATABLE, paramTypes);
     }
 
     public static Stream<Method> findMethod_returningNonScalar(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?> elementReturnType,
             final Class<?>[] paramTypes) {
 
-        return options.streamMethods(type, paramTypes)
+        return options.streamMethodsMatchingSignature(paramTypes)
                 .filter(hasReturnTypeAnyOf(ReturnTypeCategory.nonScalar(elementReturnType)));
     }
 
@@ -95,60 +89,55 @@ public final class MethodFinder {
     @Deprecated // redundant
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?> returnType,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
         return MethodFinderUtils
-                .findMethodWithPPMArg(options, type, returnType, paramTypes, additionalParamTypes);
+                .findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes);
     }
 
     @Deprecated // redundant
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
             final MethodFinderOptions options,
             final Can<Class<?>> returnTypes,
-            final Class<?> type,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
         return MethodFinderUtils
                 .findMethodWithPPMArg_returningAnyOf(
-                        options, returnTypes, type, paramTypes, additionalParamTypes);
+                        options, returnTypes, paramTypes, additionalParamTypes);
     }
 
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningBoolean(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
         return MethodFinderUtils
         .findMethodWithPPMArg_returningAnyOf(
-                options, ReturnTypeCategory.BOOLEAN.getReturnTypes(), type, paramTypes, additionalParamTypes);
+                options, ReturnTypeCategory.BOOLEAN.getReturnTypes(), paramTypes, additionalParamTypes);
     }
 
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningText(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
         return MethodFinderUtils
         .findMethodWithPPMArg_returningAnyOf(
-                options, ReturnTypeCategory.TRANSLATABLE.getReturnTypes(), type, paramTypes, additionalParamTypes);
+                options, ReturnTypeCategory.TRANSLATABLE.getReturnTypes(), paramTypes, additionalParamTypes);
     }
 
     public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningNonScalar(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?> elementReturnType,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
         return MethodFinderUtils
         .findMethodWithPPMArg_returningAnyOf(
-                options, ReturnTypeCategory.nonScalar(elementReturnType), type, paramTypes, additionalParamTypes);
+                options, ReturnTypeCategory.nonScalar(elementReturnType), paramTypes, additionalParamTypes);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
index 8701091..ff4bf16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
@@ -20,9 +20,12 @@ package org.apache.isis.core.metamodel.methods;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
+import java.util.Arrays;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.applib.annotation.Domain;
 import org.apache.isis.applib.annotation.Introspection.EncapsulationPolicy;
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
@@ -46,29 +49,34 @@ import lombok.val;
 public class MethodFinderOptions {
 
     public static MethodFinderOptions of(
-            @NonNull final Can<String> methodNameCandidatesPossiblyDuplicated,
-            @NonNull final EncapsulationPolicy encapsulationPolicy,
-            @NonNull final Predicate<Method> mustSatisfy) {
+            final @NonNull Class<?> correspondingClass,
+            final @NonNull Can<String> methodNameCandidatesPossiblyDuplicated,
+            final @NonNull EncapsulationPolicy encapsulationPolicy,
+            final @NonNull Predicate<Method> mustSatisfy) {
 
         final Predicate<Method> isNotStatic = MethodUtil::isNotStatic;
         val methodNameCandidates = methodNameCandidatesPossiblyDuplicated.distinct();
 
         return new MethodFinderOptions(
+                correspondingClass,
                 encapsulationPolicy,
                 methodNameCandidates.equals(ANY_NAME)
                         ? isNotStatic.and(mustSatisfy)
                         : isNotStatic
                             .and(method->methodNameCandidates.contains(method.getName()))
                             .and(mustSatisfy),
-                methodNameCandidates.distinct());
+                methodNameCandidates);
     }
 
-    public static final Can<String> ANY_NAME = Can.of("");
+    public static final Can<String> ANY_NAME = Can.of(""); // arbitrary marker
     public static final Class<?>[] NO_ARG = new Class<?>[0];
+    //private static final Class<?>[] ANY_ARG = new Class<?>[] {void.class}; // arbitrary marker
 
     public static MethodFinderOptions notNecessarilyPublic(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates) {
         return of(
+                correspondingClass,
                 methodNameCandidates,
                 EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED,
                 _Predicates.alwaysTrue()
@@ -76,8 +84,10 @@ public class MethodFinderOptions {
     }
 
     public static MethodFinderOptions publicOnly(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates) {
         return of(
+                correspondingClass,
                 methodNameCandidates,
                 EncapsulationPolicy.ONLY_PUBLIC_MEMBERS_SUPPORTED,
                 _Predicates.alwaysTrue()
@@ -85,17 +95,21 @@ public class MethodFinderOptions {
     }
 
     public static MethodFinderOptions accessor(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
         return havingAnyOrNoAnnotation(
+                correspondingClass,
                 methodNameCandidates,
                 memberIntrospectionPolicy);
     }
 
     public static MethodFinderOptions objectSupport(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
         return supportMethod(
+                correspondingClass,
                 methodNameCandidates,
                 memberIntrospectionPolicy,
                 Domain.Include.class,
@@ -103,9 +117,11 @@ public class MethodFinderOptions {
     }
 
     public static MethodFinderOptions livecycleCallback(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
         return supportMethod(
+                correspondingClass,
                 methodNameCandidates,
                 memberIntrospectionPolicy,
                 Domain.Include.class,
@@ -113,23 +129,30 @@ public class MethodFinderOptions {
     }
 
     public static MethodFinderOptions memberSupport(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
         return supportMethod(
+                correspondingClass,
                 methodNameCandidates,
                 memberIntrospectionPolicy,
                 Domain.Include.class,
                 ProgrammingModelConstants.ConflictingAnnotations.MEMBER_SUPPORT);
     }
 
+    @Getter private final @NonNull Class<?> correspondingClass;
     @Getter private final @NonNull EncapsulationPolicy encapsulationPolicy;
     @Getter private final @NonNull Predicate<Method> mustSatisfy;
     private final @NonNull Can<String> methodNameCandidates;
 
-    public Stream<Method> streamMethods(
-            final Class<?> type,
-            final Class<?>[] paramTypes) {
+    public Stream<Method> streamMethodsMatchingSignature(
+            final @Nullable Class<?>[] paramTypes) {
+
+        if(paramTypes==null) {
+            return streamMethodsIgnoringSignature();
+        }
 
+        val type = getCorrespondingClass();
         val classCache = _ClassCache.getInstance();
         val isEncapsulationSupported = getEncapsulationPolicy().isEncapsulatedMembersSupported();
 
@@ -138,6 +161,7 @@ public class MethodFinderOptions {
             return (isEncapsulationSupported
                     ? classCache.streamPublicOrDeclaredMethods(type)
                     : classCache.streamPublicMethods(type))
+                        .filter(method->Arrays.equals(paramTypes, method.getParameterTypes()))
                         .filter(mustSatisfy);
         }
 
@@ -150,24 +174,48 @@ public class MethodFinderOptions {
 
     }
 
+    public Stream<Method> streamMethodsIgnoringSignature() {
+        val type = getCorrespondingClass();
+        val classCache = _ClassCache.getInstance();
+        val isEncapsulationSupported = getEncapsulationPolicy().isEncapsulatedMembersSupported();
+        return (isEncapsulationSupported
+                ? classCache.streamPublicOrDeclaredMethods(type)
+                : classCache.streamPublicMethods(type))
+                    .filter(mustSatisfy);
+    }
+
+    // -- WITHERS
+
+    public MethodFinderOptions withRequiredReturnType(final @NonNull Class<?> requiredReturnType) {
+        return new MethodFinderOptions(
+                correspondingClass,
+                encapsulationPolicy,
+                mustSatisfy.and(MethodFinder.hasReturnType(requiredReturnType)),
+                methodNameCandidates);
+    }
+
     // -- HELPER
 
     private static MethodFinderOptions havingAnyOrNoAnnotation(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy) {
         return of(
+                correspondingClass,
                 methodNameCandidates,
                 memberIntrospectionPolicy.getEncapsulationPolicy(),
                 _Predicates.alwaysTrue());
     }
 
     private static MethodFinderOptions supportMethod(
+            final Class<?> correspondingClass,
             final Can<String> methodNameCandidates,
             final IntrospectionPolicy memberIntrospectionPolicy,
             final Class<? extends Annotation> annotationType,
             final ConflictingAnnotations conflictingAnnotations) {
 
         return of(
+                correspondingClass,
                 methodNameCandidates,
                 // support methods are always allowed private
                 EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
index 0aa9d9d..5b22871 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
@@ -18,15 +18,14 @@
  */
 package org.apache.isis.core.metamodel.methods;
 
-import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
-import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.reflection._ClassCache;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel.commons.MethodUtil;
 
@@ -34,61 +33,14 @@ import static org.apache.isis.commons.internal.reflection._Reflect.Filter.paramS
 
 import lombok.NonNull;
 import lombok.Value;
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
 
-@Log4j2
 public final class MethodFinderUtils {
 
     private MethodFinderUtils() {
     }
 
-    private static Stream<Method> streamMethods(
-            final MethodFinderOptions options,
-            final Class<?> type,
-            final Class<?> returnType) {
-        try {
-
-            return streamMethods(options, type)
-                    .filter(options.getMustSatisfy())
-                    .filter(method -> returnType == null
-                            || returnType.isAssignableFrom(method.getReturnType())
-//XXX for non-scalar types we should probably be a bit smarter
-//                            || (Iterable.class.isAssignableFrom(returnType)
-//                                    && Iterable.class.isAssignableFrom(method.getReturnType()))
-                            );
-        } catch (final SecurityException e) {
-            log.error("failed to enumerate methods of class %s", type);
-            return Stream.empty();
-        }
-    }
-
-    public static Method findAnnotatedMethod(
-            final MethodFinderOptions options,
-            final Object pojo,
-            final Class<? extends Annotation> annotationClass,
-            final MethodByClassMap methods) {
-
-        val clz = pojo.getClass();
-        val annotatedMethodIfAny =
-                methods.computeIfAbsent(clz, __->search(options, clz, annotationClass, methods));
-        return annotatedMethodIfAny.orElse(null);
-    }
-
-    private static Optional<Method> search(
-            final MethodFinderOptions options,
-            final Class<?> clz,
-            final Class<? extends Annotation> annotationClass,
-            final Map<Class<?>, Optional<Method>> postConstructMethods) {
-
-        return streamMethods(options, clz)
-        .filter(method->method.getAnnotation(annotationClass)!=null)
-        .findFirst();
-    }
-
     // -- PPM SUPPORT
 
-
     @Value(staticConstructor = "of")
     public static class MethodAndPpmConstructor {
         @NonNull Method supportingMethod;
@@ -107,14 +59,15 @@ public final class MethodFinderUtils {
         }
     }
 
+    // -- HELPER
+
     static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
             final MethodFinderOptions options,
-            final Class<?> type,
             final Class<?> returnType,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return streamMethods(options, type, returnType)
+        return streamMethods(options, returnType)
             .filter(MethodUtil.Predicates.paramCount(additionalParamTypes.size()+1))
             .filter(MethodUtil.Predicates.matchParamTypes(1, additionalParamTypes))
             .map(method->MethodAndPpmCandidate.of(method, method.getParameterTypes()[0]))
@@ -125,24 +78,21 @@ public final class MethodFinderUtils {
     static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
             final MethodFinderOptions options,
             final Can<Class<?>> returnTypes,
-            final Class<?> type,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
         return returnTypes.stream()
-        .flatMap(returnType->findMethodWithPPMArg(options, type, returnType, paramTypes, additionalParamTypes));
+        .flatMap(returnType->findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes));
     }
 
-    // -- HELPER
-
     private static Stream<Method> streamMethods(
             final MethodFinderOptions options,
-            final Class<?> type) {
-        val classCache = _ClassCache.getInstance();
-        return (options.getEncapsulationPolicy().isEncapsulatedMembersSupported()
-                ? classCache.streamPublicOrDeclaredMethods(type)
-                : classCache.streamPublicMethods(type))
-                    .filter(options.getMustSatisfy()::test);
+            final @Nullable Class<?> returnType) {
+
+        return options.streamMethodsIgnoringSignature()
+            .filter(method -> returnType == null
+                || returnType.isAssignableFrom(method.getReturnType()));
     }
 
+
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java
index b52ab9b..9a445d5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 
 import javax.annotation.PostConstruct;
 
+import org.junit.Before;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -31,8 +32,6 @@ import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 
 import lombok.val;
 
@@ -46,14 +45,25 @@ public class MethodFinderUtilsTest {
         private void thisDoesHaveAnnotation(){}
     }
 
+    private HasPostConstructMethodCache hasPostConstructMethodCache;
+
+    @Before
+    public void setup() {
+        val methodByClassMap = new MethodByClassMap();
+        this.hasPostConstructMethodCache = new HasPostConstructMethodCache() {
+            @Override
+            public MethodByClassMap getPostConstructMethodsCache() {
+                return methodByClassMap;
+            }
+        };
+    }
+
+
     @Test
     public void whenExists() throws Exception {
 
-        val cache = new MethodByClassMap();
-        final Method method = MethodFinderUtils
-                .findAnnotatedMethod(
-                        MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
-                        new WithPostConstruct(), PostConstruct.class, cache );
+        val cache = hasPostConstructMethodCache.getPostConstructMethodsCache();
+        val method = hasPostConstructMethodCache.postConstructMethodFor(new WithPostConstruct());
 
         assertThat(method, is(not(nullValue())));
         final Optional<Method> actual = cache.get(WithPostConstruct.class);
@@ -65,11 +75,8 @@ public class MethodFinderUtilsTest {
     @Test
     public void whenDoesNotExist() throws Exception {
 
-        val cache = new MethodByClassMap();
-        final Method method = MethodFinderUtils
-                .findAnnotatedMethod(
-                        MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
-                        new NoPostConstruct(), PostConstruct.class, cache);
+        val cache = hasPostConstructMethodCache.getPostConstructMethodsCache();
+        val method = hasPostConstructMethodCache.postConstructMethodFor(new NoPostConstruct());
 
         assertThat(method, is(nullValue()));
         final Optional<Method> actual = cache.get(NoPostConstruct.class);
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
index af39b8a..791476b 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
@@ -34,8 +34,8 @@ final class FailureUtil {
 
     public static HttpStatusCode getFailureStatusCodeIfAny(final Throwable ex) {
 
-        val errorCodeGetter = MethodFinderOptions.publicOnly(Can.ofSingleton("getErrorCode"))
-        .streamMethods(ex.getClass(), MethodFinderOptions.NO_ARG)
+        val errorCodeGetter = MethodFinderOptions.publicOnly(ex.getClass(), Can.ofSingleton("getErrorCode"))
+        .streamMethodsMatchingSignature(MethodFinderOptions.NO_ARG)
         .filter(MethodFinder.hasReturnType(int.class))
         .findFirst()
         .orElse(null);