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/05 08:37:44 UTC

[isis] branch master updated: ISIS-2774: remove ImperativeFacetMulti, simplify CallbackFacetFactories and their tests

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 a87535e  ISIS-2774: remove ImperativeFacetMulti, simplify CallbackFacetFactories and their tests
a87535e is described below

commit a87535e7188915c440aae3261723e33131773871
Author: andi-huber <ah...@apache.org>
AuthorDate: Sun Sep 5 10:37:36 2021 +0200

    ISIS-2774: remove ImperativeFacetMulti, simplify CallbackFacetFactories
    and their tests
---
 .../core/metamodel/facets/ImperativeFacet.java     |  16 ---
 .../metamodel/facets/ImperativeFacetMulti.java     |  34 ------
 .../facets/object/callbacks/CallbackFacet.java     |   4 +-
 .../object/callbacks/CallbackFacetAbstract.java    |  33 ++----
 ...tory.java => CallbackFacetFactoryAbstract.java} |  50 +++++----
 .../callbacks/CreatedCallbackFacetAbstract.java    |   9 +-
 .../callbacks/CreatedCallbackFacetFactory.java     |  33 +-----
 .../callbacks/CreatedCallbackFacetViaMethod.java   |   8 +-
 .../object/callbacks/LoadCallbackFacetFactory.java |  62 -----------
 .../callbacks/LoadedCallbackFacetAbstract.java     |   9 +-
 ...Method.java => LoadedCallbackFacetFactory.java} |  18 ++--
 .../callbacks/LoadedCallbackFacetViaMethod.java    |  12 +--
 .../callbacks/PersistCallbackFacetFactory.java     |  90 ----------------
 .../PersistCallbackViaSaveMethodFacetFactory.java  |  90 ----------------
 .../callbacks/PersistedCallbackFacetAbstract.java  |   9 +-
 ...hod.java => PersistedCallbackFacetFactory.java} |  18 ++--
 .../callbacks/PersistedCallbackFacetViaMethod.java |  12 +--
 .../callbacks/PersistingCallbackFacetAbstract.java |   9 +-
 ...ct.java => PersistingCallbackFacetFactory.java} |  19 ++--
 .../PersistingCallbackFacetViaMethod.java          |  12 +--
 .../RemoveCallbackViaDeleteMethodFacetFactory.java |  73 -------------
 .../callbacks/RemovingCallbackFacetAbstract.java   |   9 +-
 ...thod.java => RemovingCallbackFacetFactory.java} |  18 ++--
 .../callbacks/RemovingCallbackFacetViaMethod.java  |  12 +--
 .../callbacks/UpdateCallbackFacetFactory.java      |  80 ---------------
 .../callbacks/UpdatedCallbackFacetAbstract.java    |   9 +-
 ...ethod.java => UpdatedCallbackFacetFactory.java} |  18 ++--
 .../callbacks/UpdatedCallbackFacetViaMethod.java   |  12 +--
 .../callbacks/UpdatingCallbackFacetAbstract.java   |   9 +-
 ...thod.java => UpdatingCallbackFacetFactory.java} |  18 ++--
 .../callbacks/UpdatingCallbackFacetViaMethod.java  |  12 +--
 .../metamodel/methods/MethodLiteralConstants.java  |  25 +++--
 .../dflt/ProgrammingModelFacetsJava8.java          |  22 ++--
 .../callback/CallbackFacetFactoryTestAbstract.java |  44 ++++++++
 .../callback/CreatedCallbackFacetFactoryTest.java  |  22 +---
 .../callback/DeleteCallbackFacetFactoryTest.java   |  69 -------------
 ...st.java => LoadedCallbackFacetFactoryTest.java} |  31 ++----
 .../PersistAndSaveCallbackFacetFactoryTest.java    | 114 ---------------------
 .../callback/PersistCallbackFacetFactoryTest.java  |  90 ----------------
 .../PersistedCallbackFacetFactoryTest.java         |  76 ++++++++++++++
 .../PersistingCallbackFacetFactoryTest.java        |  76 ++++++++++++++
 .../RemoveAndDeleteCallbackFacetFactoryTest.java   |  85 ---------------
 ....java => RemovingCallbackFacetFactoryTest.java} |  49 +++++----
 .../callback/SaveCallbackFacetFactoryTest.java     |  90 ----------------
 .../callback/UpdateCallbackFacetFactoryTest.java   |  90 ----------------
 .../callback/UpdatedCallbackFacetFactoryTest.java  |  53 ++++++++++
 .../callback/UpdatingCallbackFacetFactoryTest.java |  53 ++++++++++
 .../facets/param/name/ParameterNameFacetTest.java  |   8 +-
 48 files changed, 546 insertions(+), 1268 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
index d95cadb..9c4f0cd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacet.java
@@ -54,22 +54,6 @@ public interface ImperativeFacet extends Facet {
 
     /**
      * The {@link Method}s invoked by this {@link Facet}.
-     *
-     * <p>
-     * In the vast majority of cases there is only a single {@link Method} (eg
-     * wrapping a property's getter). However, some {@link Facet}s, such as
-     * those for callbacks, could map to multiple {@link Method}s.
-     * Implementations that will return multiple {@link Method}s should
-     * implement the {@link ImperativeFacetMulti} sub-interface that provides
-     * the ability to {@link ImperativeFacetMulti#addMethod(Method) add}
-     * {@link Method}s as part of the interface API. For example:
-     *
-     * <pre>
-     * if (someFacet instanceof ImperativeFacetMulti) {
-     *     ImperativeFacetMulti ifm = (ImperativeFacetMulti)someFacet;
-     *     ifm.addMethod(...);
-     * }
-     * </pre>
      */
     public Can<Method> getMethods();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetMulti.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetMulti.java
deleted file mode 100644
index 4b77abd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ImperativeFacetMulti.java
+++ /dev/null
@@ -1,34 +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;
-
-public interface ImperativeFacetMulti
-extends ImperativeFacet {
-
-    /**
-     * Associate an additional method, to be returned from
-     * {@link ImperativeFacet#getMethods()}.
-     *
-     * @param method
-     */
-    public void addMethod(final Method method);
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
index cb48913..116fd16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacet.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import org.apache.isis.applib.exceptions.unrecoverable.DomainModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.ImperativeFacetMulti;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 /**
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
  * (eg about to be persisted).
  */
 public interface CallbackFacet
-extends Facet, ImperativeFacetMulti {
+extends ImperativeFacet {
 
     public void invoke(ManagedObject object);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
index c3b0094..92cfb25 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetAbstract.java
@@ -20,12 +20,8 @@
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
-import java.util.List;
 
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
@@ -33,6 +29,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 
+import lombok.Getter;
+
 /**
  * Adapter superclass for {@link Facet}s for {@link CallbackFacet}.
  */
@@ -40,11 +38,16 @@ public abstract class CallbackFacetAbstract
 extends FacetAbstract
 implements CallbackFacet {
 
-    private final List<Method> methods = _Lists.newConcurrentList();
-    private final _Lazy<Can<Method>> methodsUnmodifiable = _Lazy.threadSafe(()->Can.ofCollection(methods));
+    @Getter(onMethod_ = {@Override})
+    private final Can<Method> methods;
 
-    protected CallbackFacetAbstract(final Class<? extends Facet> facetType, final FacetHolder holder) {
+    protected CallbackFacetAbstract(
+            final Class<? extends Facet> facetType,
+            final Can<Method> methods,
+            final FacetHolder holder) {
         super(facetType, holder);
+        this.methods = methods
+                .map(method->_Reflect.lookupRegularMethodForSynthetic(method).orElse(null));
     }
 
     @Override
@@ -53,22 +56,6 @@ implements CallbackFacet {
     }
 
     @Override
-    public final void addMethod(Method method) {
-        if(methodsUnmodifiable.isMemoized()) {
-            throw _Exceptions
-                .illegalState("getMethods() was already called, can no longer add any method: %s", method);
-        }
-        _Reflect
-        .lookupRegularMethodForSynthetic(method)
-        .ifPresent(methods::add);
-    }
-
-    @Override
-    public final Can<Method> getMethods() {
-        return methodsUnmodifiable.get();
-    }
-
-    @Override
     protected final String toStringValues() {
         // free of side-effects, though might not reflect the final state if called too early
         return "methods=" + methods;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemoveCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactoryAbstract.java
similarity index 58%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemoveCallbackFacetFactory.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactoryAbstract.java
index 822e2b2..ecfd421 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemoveCallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactoryAbstract.java
@@ -16,59 +16,55 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import javax.inject.Inject;
+import java.util.function.BiFunction;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
 import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
 
+import lombok.NonNull;
 import lombok.val;
 
-public class RemoveCallbackFacetFactory
+abstract class CallbackFacetFactoryAbstract
 extends MethodPrefixBasedFacetFactoryAbstract {
 
-    private static final String PREFIX = MethodLiteralConstants.REMOVING_PREFIX;
+    private final MethodLiteralConstants.CallbackMethod callbackMethodEnum;
+    private final BiFunction<Can<Method>, FacetHolder, CallbackFacet> callbackFacetConstructor;
+
+    protected CallbackFacetFactoryAbstract(
+            final @NonNull MetaModelContext mmc,
+            final @NonNull MethodLiteralConstants.CallbackMethod callbackMethodEnum,
+            final @NonNull BiFunction<Can<Method>, FacetHolder, CallbackFacet> callbackFacetConstructor) {
 
-    @Inject
-    public RemoveCallbackFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
+        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, callbackMethodEnum.getMethodNames());
+        this.callbackMethodEnum = callbackMethodEnum;
+        this.callbackFacetConstructor = callbackFacetConstructor;
     }
 
     @Override
-    public void process(final ProcessClassContext processClassContext) {
+    public final void process(final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
 
-        Method method = MethodFinderUtils
-                .findMethod(
+        val callbackMethods = callbackMethodEnum
+                .getMethodNames()
+                .map(callbackMethodName->MethodFinderUtils.findMethod(
                         MethodFinderOptions
                         .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                        cls, PREFIX, void.class,
-                        NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            val facet = facetHolder.getFacet(RemovingCallbackFacet.class);
-            if (facet == null) {
-                facets.add(new RemovingCallbackFacetViaMethod(method, facetHolder));
-            } else {
-                facet.addMethod(method);
-            }
-        }
+                        cls, callbackMethodName, void.class, NO_ARG));
 
-        FacetUtil.addFacets(facets);
+        if(callbackMethods.isNotEmpty()) {
+            callbackMethods.forEach(processClassContext::removeMethod);
+            addFacet(callbackFacetConstructor.apply(callbackMethods, facetHolder));
+        }
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java
index 1af564d..e563deb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements CreatedCallbackFacet {
         return CreatedCallbackFacet.class;
     }
 
-    public CreatedCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public CreatedCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java
index e858d4a..169da78 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java
@@ -16,46 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import javax.inject.Inject;
 
-import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
 import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
 
-public class CreatedCallbackFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = MethodLiteralConstants.CREATED_PREFIX;
+public class CreatedCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
     @Inject
     public CreatedCallbackFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-
-        val method = MethodFinderUtils
-                .findMethod(
-                        MethodFinderOptions
-                        .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                        cls, PREFIX, void.class, NO_ARG);
-
-        if (method != null) {
-            addFacet(new CreatedCallbackFacetViaMethod(method, facetHolder));
-            processClassContext.removeMethod(method);
-        }
-
+        super(mmc, MethodLiteralConstants.CallbackMethod.CREATED, CreatedCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetViaMethod.java
index 8afdb0b..1d37ba5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetViaMethod.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
@@ -28,9 +29,10 @@ public class CreatedCallbackFacetViaMethod
 extends CreatedCallbackFacetAbstract
 implements ImperativeFacet {
 
-    public CreatedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public CreatedCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java
deleted file mode 100644
index bc3268d..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java
+++ /dev/null
@@ -1,62 +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.object.callbacks;
-
-import java.lang.reflect.Method;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
-import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class LoadCallbackFacetFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = MethodLiteralConstants.LOADED_PREFIX;
-
-    @Inject
-    public LoadCallbackFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-
-        Method method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            addFacet(new LoadedCallbackFacetViaMethod(method, facetHolder));
-        }
-
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetAbstract.java
index cf59832..39f58ed 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements LoadedCallbackFacet {
         return LoadedCallbackFacet.class;
     }
 
-    public LoadedCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public LoadedCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetFactory.java
similarity index 68%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetFactory.java
index aff9755..a2825f2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetFactory.java
@@ -16,21 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
-import java.lang.reflect.Method;
+import javax.inject.Inject;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 
-public class PersistingCallbackFacetViaMethod
-extends PersistingCallbackFacetAbstract
-implements ImperativeFacet {
+public class LoadedCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
-    public PersistingCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    @Inject
+    public LoadedCallbackFacetFactory(final MetaModelContext mmc) {
+        super(mmc, MethodLiteralConstants.CallbackMethod.LOADED, LoadedCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetViaMethod.java
index 2f8881a..8b1a228 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/LoadedCallbackFacetViaMethod.java
@@ -21,16 +21,16 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 public class LoadedCallbackFacetViaMethod
-extends LoadedCallbackFacetAbstract
-implements ImperativeFacet {
+extends LoadedCallbackFacetAbstract {
 
-    public LoadedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public LoadedCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistCallbackFacetFactory.java
deleted file mode 100644
index 475e489..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistCallbackFacetFactory.java
+++ /dev/null
@@ -1,90 +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.object.callbacks;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
-import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class PersistCallbackFacetFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final Can<String> PREFIXES = Can.ofCollection(_Lists.of(
-            MethodLiteralConstants.PERSISTED_PREFIX,
-            MethodLiteralConstants.PERSISTING_PREFIX));
-
-    @Inject
-    public PersistCallbackFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
-
-        Method method = null;
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, MethodLiteralConstants.PERSISTING_PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            val facet = facetHolder.getFacet(PersistingCallbackFacet.class);
-            if (facet == null) {
-                facets.add(new PersistingCallbackFacetViaMethod(method, facetHolder));
-            } else {
-                facet.addMethod(method);
-            }
-        }
-
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, MethodLiteralConstants.PERSISTED_PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            val facet = facetHolder.getFacet(PersistedCallbackFacet.class);
-            if (facet == null) {
-                facets.add(new PersistedCallbackFacetViaMethod(method, facetHolder));
-            } else {
-                facet.addMethod(method);
-            }
-        }
-
-        FacetUtil.addFacets(facets);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistCallbackViaSaveMethodFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistCallbackViaSaveMethodFacetFactory.java
deleted file mode 100644
index 75f932c..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistCallbackViaSaveMethodFacetFactory.java
+++ /dev/null
@@ -1,90 +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.object.callbacks;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
-import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class PersistCallbackViaSaveMethodFacetFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final Can<String> PREFIXES = Can.ofCollection(_Lists.of(
-            MethodLiteralConstants.SAVED_PREFIX,
-            MethodLiteralConstants.SAVING_PREFIX));
-
-    @Inject
-    public PersistCallbackViaSaveMethodFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
-
-        Method method = null;
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, MethodLiteralConstants.SAVING_PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            val facet = facetHolder.getFacet(PersistingCallbackFacet.class);
-            if (facet == null) {
-                facets.add(new PersistingCallbackFacetViaMethod(method, facetHolder));
-            } else {
-                facet.addMethod(method);
-            }
-        }
-
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, MethodLiteralConstants.SAVED_PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            val facet = facetHolder.getFacet(PersistedCallbackFacet.class);
-            if (facet == null) {
-                facets.add(new PersistedCallbackFacetViaMethod(method, facetHolder));
-            } else {
-                facet.addMethod(method);
-            }
-        }
-
-        FacetUtil.addFacets(facets);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetAbstract.java
index 9be7e7c..a39f758 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements PersistedCallbackFacet {
         return PersistedCallbackFacet.class;
     }
 
-    public PersistedCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public PersistedCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetFactory.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetFactory.java
index 530c1ed..c5e8bae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetFactory.java
@@ -16,21 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
-import java.lang.reflect.Method;
+import javax.inject.Inject;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 
-public class PersistedCallbackFacetViaMethod
-extends PersistedCallbackFacetAbstract
-implements ImperativeFacet {
+public class PersistedCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
-    public PersistedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    @Inject
+    public PersistedCallbackFacetFactory(final MetaModelContext mmc) {
+        super(mmc, MethodLiteralConstants.CallbackMethod.PERSISTED, PersistedCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
index 530c1ed..b4c7d92 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
@@ -21,16 +21,16 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 public class PersistedCallbackFacetViaMethod
-extends PersistedCallbackFacetAbstract
-implements ImperativeFacet {
+extends PersistedCallbackFacetAbstract {
 
-    public PersistedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public PersistedCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetAbstract.java
index c061500..3648875 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements PersistingCallbackFacet {
         return PersistingCallbackFacet.class;
     }
 
-    public PersistingCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public PersistingCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetFactory.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetFactory.java
index 1af564d..f8139dc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CreatedCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetFactory.java
@@ -16,22 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import javax.inject.Inject;
 
-public abstract class CreatedCallbackFacetAbstract
-extends CallbackFacetAbstract
-implements CreatedCallbackFacet {
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 
-    private static final Class<? extends Facet> type() {
-        return CreatedCallbackFacet.class;
-    }
+public class PersistingCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
-    public CreatedCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    @Inject
+    public PersistingCallbackFacetFactory(final MetaModelContext mmc) {
+        super(mmc, MethodLiteralConstants.CallbackMethod.PERSISTING, PersistingCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java
index aff9755..57c50dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistingCallbackFacetViaMethod.java
@@ -21,16 +21,16 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 public class PersistingCallbackFacetViaMethod
-extends PersistingCallbackFacetAbstract
-implements ImperativeFacet {
+extends PersistingCallbackFacetAbstract {
 
-    public PersistingCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public PersistingCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemoveCallbackViaDeleteMethodFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemoveCallbackViaDeleteMethodFacetFactory.java
deleted file mode 100644
index 0307344..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemoveCallbackViaDeleteMethodFacetFactory.java
+++ /dev/null
@@ -1,73 +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.object.callbacks;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
-import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class RemoveCallbackViaDeleteMethodFacetFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final String PREFIX = MethodLiteralConstants.DELETING_PREFIX;
-
-    @Inject
-    public RemoveCallbackViaDeleteMethodFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, Can.ofSingleton(PREFIX));
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
-
-        Method method = null;
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            final RemovingCallbackFacet facet = facetHolder.getFacet(RemovingCallbackFacet.class);
-            if (facet == null) {
-                facets.add(new RemovingCallbackFacetViaMethod(method, facetHolder));
-            } else {
-                facet.addMethod(method);
-            }
-        }
-
-        FacetUtil.addFacets(facets);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetAbstract.java
index 3552df4..ca206d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements RemovingCallbackFacet {
         return RemovingCallbackFacet.class;
     }
 
-    public RemovingCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public RemovingCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetFactory.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetFactory.java
index 530c1ed..e2afd0a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetFactory.java
@@ -16,21 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
-import java.lang.reflect.Method;
+import javax.inject.Inject;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 
-public class PersistedCallbackFacetViaMethod
-extends PersistedCallbackFacetAbstract
-implements ImperativeFacet {
+public class RemovingCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
-    public PersistedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    @Inject
+    public RemovingCallbackFacetFactory(final MetaModelContext mmc) {
+        super(mmc, MethodLiteralConstants.CallbackMethod.REMOVING, RemovingCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetViaMethod.java
index 667ec33..54841ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/RemovingCallbackFacetViaMethod.java
@@ -21,16 +21,16 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 public class RemovingCallbackFacetViaMethod
-extends RemovingCallbackFacetAbstract
-implements ImperativeFacet {
+extends RemovingCallbackFacetAbstract {
 
-    public RemovingCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public RemovingCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdateCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdateCallbackFacetFactory.java
deleted file mode 100644
index 0a3ba51..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdateCallbackFacetFactory.java
+++ /dev/null
@@ -1,80 +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.object.callbacks;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import javax.inject.Inject;
-
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
-import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
-import org.apache.isis.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
-
-import lombok.val;
-
-public class UpdateCallbackFacetFactory
-extends MethodPrefixBasedFacetFactoryAbstract {
-
-    private static final Can<String> PREFIXES = Can.ofCollection(_Lists.of(
-            MethodLiteralConstants.UPDATED_PREFIX,
-            MethodLiteralConstants.UPDATING_PREFIX));
-
-    @Inject
-    public UpdateCallbackFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
-
-        Method method = null;
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, MethodLiteralConstants.UPDATING_PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            facets.add(new UpdatingCallbackFacetViaMethod(method, facetHolder));
-        }
-
-        method = MethodFinderUtils.findMethod(
-                MethodFinderOptions
-                .livecycleCallback(processClassContext.getIntrospectionPolicy()),
-                cls, MethodLiteralConstants.UPDATED_PREFIX, void.class, NO_ARG);
-        if (method != null) {
-            processClassContext.removeMethod(method);
-            facets.add(new UpdatedCallbackFacetViaMethod(method, facetHolder));
-        }
-
-        FacetUtil.addFacets(facets);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetAbstract.java
index 25b2310..e9d5345 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements UpdatedCallbackFacet {
         return UpdatedCallbackFacet.class;
     }
 
-    public UpdatedCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public UpdatedCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetFactory.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetFactory.java
index 530c1ed..cb4bdc9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetFactory.java
@@ -16,21 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
-import java.lang.reflect.Method;
+import javax.inject.Inject;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 
-public class PersistedCallbackFacetViaMethod
-extends PersistedCallbackFacetAbstract
-implements ImperativeFacet {
+public class UpdatedCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
-    public PersistedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    @Inject
+    public UpdatedCallbackFacetFactory(final MetaModelContext mmc) {
+        super(mmc, MethodLiteralConstants.CallbackMethod.UPDATED, UpdatedCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetViaMethod.java
index f65bd9e..33083f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatedCallbackFacetViaMethod.java
@@ -21,16 +21,16 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 public class UpdatedCallbackFacetViaMethod
-extends UpdatedCallbackFacetAbstract
-implements ImperativeFacet {
+extends UpdatedCallbackFacetAbstract {
 
-    public UpdatedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public UpdatedCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetAbstract.java
index cde6e72..cfce223 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
+import java.lang.reflect.Method;
+
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -30,8 +33,10 @@ implements UpdatingCallbackFacet {
         return UpdatingCallbackFacet.class;
     }
 
-    public UpdatingCallbackFacetAbstract(final FacetHolder holder) {
-        super(type(), holder);
+    public UpdatingCallbackFacetAbstract(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(type(), methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetFactory.java
similarity index 67%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetFactory.java
index 530c1ed..c809a72 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/PersistedCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetFactory.java
@@ -16,21 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.object.callbacks;
 
-import java.lang.reflect.Method;
+import javax.inject.Inject;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
 
-public class PersistedCallbackFacetViaMethod
-extends PersistedCallbackFacetAbstract
-implements ImperativeFacet {
+public class UpdatingCallbackFacetFactory
+extends CallbackFacetFactoryAbstract {
 
-    public PersistedCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    @Inject
+    public UpdatingCallbackFacetFactory(final MetaModelContext mmc) {
+        super(mmc, MethodLiteralConstants.CallbackMethod.UPDATING, UpdatingCallbackFacetViaMethod::new);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetViaMethod.java
index 5f6b823..042ee9b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/UpdatingCallbackFacetViaMethod.java
@@ -20,16 +20,16 @@ package org.apache.isis.core.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 public class UpdatingCallbackFacetViaMethod
-extends UpdatingCallbackFacetAbstract
-implements ImperativeFacet {
+extends UpdatingCallbackFacetAbstract {
 
-    public UpdatingCallbackFacetViaMethod(final Method method, final FacetHolder holder) {
-        super(holder);
-        addMethod(method);
+    public UpdatingCallbackFacetViaMethod(
+            final Can<Method> methods,
+            final FacetHolder holder) {
+        super(methods, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java
index 630c7cf..f167259 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodLiteralConstants.java
@@ -44,16 +44,20 @@ public final class MethodLiteralConstants {
 
     // -- LIFECYCLE CALLBACKS
 
-    public static final String CREATED_PREFIX = "created";
-    public static final String LOADED_PREFIX = "loaded";
-    public static final String SAVED_PREFIX = "saved";
-    public static final String SAVING_PREFIX = "saving";
-    public static final String PERSISTED_PREFIX = "persisted";
-    public static final String PERSISTING_PREFIX = "persisting";
-    public static final String DELETING_PREFIX = "deleting";
-    public static final String REMOVING_PREFIX = "removing";
-    public static final String UPDATED_PREFIX = "updated";
-    public static final String UPDATING_PREFIX = "updating";
+    @Getter
+    public enum CallbackMethod {
+        CREATED("created"),
+        LOADED("loaded"),
+        PERSISTED("persisted", "saved"),
+        PERSISTING("persisting", "saving"),
+        REMOVING("removing", "deleting"),
+        UPDATED("updated"),
+        UPDATING("updating");
+        CallbackMethod(final String ...methodNames) {
+            this.methodNames = Can.of(methodNames);
+        }
+        private final Can<String> methodNames;
+    }
 
     // -- OBJECT SUPPORT
 
@@ -78,7 +82,6 @@ public final class MethodLiteralConstants {
     public static final String NAMED_PREFIX = "named"; // dynamic naming
     public static final String DESCRIBED_PREFIX = "described"; // dynamic description
 
-
     // -- OTHER LITERALS
 
     public static final String TO_STRING = "toString";
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
index 854c3d1..91cf97d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
@@ -45,11 +45,12 @@ import org.apache.isis.core.metamodel.facets.members.named.method.NamedFacetForM
 import org.apache.isis.core.metamodel.facets.object.ViewModelSemanticCheckingFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.BookmarkPolicyFacetFallbackFactory;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LoadCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackViaSaveMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdateCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacetUsingValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethodFactory;
 import org.apache.isis.core.metamodel.facets.object.defaults.annotcfg.DefaultedFacetAnnotationElseConfigurationFactory;
@@ -236,11 +237,12 @@ extends ProgrammingModelAbstract {
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new HideForContextFacetViaMethodFactory(mmc));
 
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new CreatedCallbackFacetFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new LoadCallbackFacetFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new PersistCallbackViaSaveMethodFacetFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new PersistCallbackFacetFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new UpdateCallbackFacetFactory(mmc));
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new RemoveCallbackFacetFactory(mmc));
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new LoadedCallbackFacetFactory(mmc));
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new PersistedCallbackFacetFactory(mmc));
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new PersistingCallbackFacetFactory(mmc));
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new UpdatingCallbackFacetFactory(mmc));
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new UpdatedCallbackFacetFactory(mmc));
+        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new RemovingCallbackFacetFactory(mmc));
 
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ValidateObjectFacetMethodFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ObjectValidPropertiesFacetImplFactory(mmc));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java
new file mode 100644
index 0000000..d9c3e38
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java
@@ -0,0 +1,44 @@
+package org.apache.isis.core.metamodel.facets.object.callback;
+
+import org.junit.jupiter.api.Assertions;
+
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants;
+
+import lombok.val;
+
+abstract class CallbackFacetFactoryTestAbstract
+extends AbstractFacetFactoryTest {
+
+    protected void assertPicksUp(
+            final int expectedCallbackCount,
+            final FacetFactory facetFactory,
+            final Class<?> type,
+            final MethodLiteralConstants.CallbackMethod callbackMethod,
+            final Class<? extends ImperativeFacet> facetType) {
+
+        // when
+        facetFactory.process(ProcessClassContext
+                .forTesting(type, methodRemover, facetedMethod));
+
+        val callbackMethods = callbackMethod.getMethodNames()
+                .map(methodName->findMethod(type, methodName));
+
+        Assertions.assertEquals(expectedCallbackCount, callbackMethods.size());
+
+        val facet = facetedMethod.getFacet(facetType);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ImperativeFacet);
+        val imperativeFacet = facet;
+
+        callbackMethods.forEach(method->{
+            assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
+            assertTrue(imperativeFacet.getMethods().contains(method));
+        });
+
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java
index f24b405..f3d7ee8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java
@@ -19,17 +19,12 @@
 
 package org.apache.isis.core.metamodel.facets.object.callback;
 
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacet;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacetViaMethod;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
 
 public class CreatedCallbackFacetFactoryTest
-extends AbstractFacetFactoryTest {
+extends CallbackFacetFactoryTestAbstract {
 
     private CreatedCallbackFacetFactory facetFactory;
 
@@ -52,18 +47,7 @@ extends AbstractFacetFactoryTest {
             public void created() {
             };
         }
-        final Method method = findMethod(Customer.class, "created");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CreatedCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CreatedCallbackFacetViaMethod);
-        final CreatedCallbackFacetViaMethod createdCallbackFacetViaMethod = (CreatedCallbackFacetViaMethod) facet;
-        assertEquals(method, createdCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.CREATED, CreatedCallbackFacet.class);
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/DeleteCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/DeleteCallbackFacetFactoryTest.java
deleted file mode 100644
index 5c0eaa4..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/DeleteCallbackFacetFactoryTest.java
+++ /dev/null
@@ -1,69 +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.object.callback;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackViaDeleteMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacetViaMethod;
-
-public class DeleteCallbackFacetFactoryTest
-extends AbstractFacetFactoryTest {
-
-    private RemoveCallbackViaDeleteMethodFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new RemoveCallbackViaDeleteMethodFacetFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testDeletingLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void deleting() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "deleting");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(RemovingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof RemovingCallbackFacetViaMethod);
-        final RemovingCallbackFacetViaMethod deletingCallbackFacetViaMethod = (RemovingCallbackFacetViaMethod) facet;
-        assertEquals(method, deletingCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/LoadCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java
similarity index 53%
rename from core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/LoadCallbackFacetFactoryTest.java
rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java
index bb1c33a..7971d4d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/LoadCallbackFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java
@@ -19,24 +19,20 @@
 
 package org.apache.isis.core.metamodel.facets.object.callback;
 
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LoadCallbackFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacetViaMethod;
+import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
 
-public class LoadCallbackFacetFactoryTest extends AbstractFacetFactoryTest {
+public class LoadedCallbackFacetFactoryTest
+extends CallbackFacetFactoryTestAbstract {
 
-    private LoadCallbackFacetFactory facetFactory;
+    private LoadedCallbackFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new LoadCallbackFacetFactory(metaModelContext);
+        facetFactory = new LoadedCallbackFacetFactory(metaModelContext);
     }
 
     @Override
@@ -49,20 +45,9 @@ public class LoadCallbackFacetFactoryTest extends AbstractFacetFactoryTest {
         class Customer {
             @SuppressWarnings("unused")
             public void loaded() {
-            };
+            }
         }
-        final Method method = findMethod(Customer.class, "loaded");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(LoadedCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof LoadedCallbackFacetViaMethod);
-        final LoadedCallbackFacetViaMethod loadedCallbackFacetViaMethod = (LoadedCallbackFacetViaMethod) facet;
-        assertEquals(method, loadedCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.LOADED, LoadedCallbackFacet.class);
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistAndSaveCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistAndSaveCallbackFacetFactoryTest.java
deleted file mode 100644
index b678882..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistAndSaveCallbackFacetFactoryTest.java
+++ /dev/null
@@ -1,114 +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.object.callback;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackViaSaveMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacetViaMethod;
-
-import lombok.val;
-
-public class PersistAndSaveCallbackFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private PersistCallbackViaSaveMethodFacetFactory saveFacetFactory;
-    private PersistCallbackFacetFactory persistFacetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        saveFacetFactory = new PersistCallbackViaSaveMethodFacetFactory(metaModelContext);
-        persistFacetFactory = new PersistCallbackFacetFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        saveFacetFactory = null;
-        persistFacetFactory = null;
-        super.tearDown();
-    }
-
-    public void testSavingAndPersistingLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void saving() {
-            };
-
-            @SuppressWarnings("unused")
-            public void persisting() {
-            };
-        }
-        final Method saveMethod = findMethod(Customer.class, "saving");
-        final Method persistMethod = findMethod(Customer.class, "persisting");
-
-        saveFacetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-        persistFacetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(PersistingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof PersistingCallbackFacetViaMethod);
-        final PersistingCallbackFacetViaMethod persistingCallbackFacetViaMethod = (PersistingCallbackFacetViaMethod) facet;
-        val methods = persistingCallbackFacetViaMethod.getMethods();
-        assertTrue(methods.contains(saveMethod));
-        assertTrue(methods.contains(persistMethod));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(saveMethod));
-    }
-
-    public void testSavedAndPersistedLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void saved() {
-            };
-
-            @SuppressWarnings("unused")
-            public void persisted() {
-            };
-        }
-        final Method saveMethod = findMethod(Customer.class, "saved");
-        final Method persistMethod = findMethod(Customer.class, "persisted");
-
-        saveFacetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-        persistFacetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(PersistedCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof PersistedCallbackFacetViaMethod);
-        final PersistedCallbackFacetViaMethod persistedCallbackFacetViaMethod = (PersistedCallbackFacetViaMethod) facet;
-        val methods = persistedCallbackFacetViaMethod.getMethods();
-        assertTrue(methods.contains(saveMethod));
-        assertTrue(methods.contains(persistMethod));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(saveMethod));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistCallbackFacetFactoryTest.java
deleted file mode 100644
index 570a486..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistCallbackFacetFactoryTest.java
+++ /dev/null
@@ -1,90 +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.object.callback;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacetViaMethod;
-
-public class PersistCallbackFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private PersistCallbackFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new PersistCallbackFacetFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testPersistingLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void persisting() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "persisting");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(PersistingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof PersistingCallbackFacetViaMethod);
-        final PersistingCallbackFacetViaMethod persistingCallbackFacetViaMethod = (PersistingCallbackFacetViaMethod) facet;
-        assertEquals(method, persistingCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-    public void testPersistedLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void persisted() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "persisted");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(PersistedCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof PersistedCallbackFacetViaMethod);
-        final PersistedCallbackFacetViaMethod persistedCallbackFacetViaMethod = (PersistedCallbackFacetViaMethod) facet;
-        assertEquals(method, persistedCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java
new file mode 100644
index 0000000..9a14625
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java
@@ -0,0 +1,76 @@
+/*
+ *  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.object.callback;
+
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacet;
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
+
+public class PersistedCallbackFacetFactoryTest
+extends CallbackFacetFactoryTestAbstract {
+
+    private PersistedCallbackFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new PersistedCallbackFacetFactory(metaModelContext);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testPersistedLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void persisted() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTED, PersistedCallbackFacet.class);
+    }
+
+    public void testSavedLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void saved() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTED, PersistedCallbackFacet.class);
+    }
+
+    public void testSavedAndPersistedLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void saved() {
+            }
+
+            @SuppressWarnings("unused")
+            public void persisted() {
+            }
+        }
+        assertPicksUp(2, facetFactory, Customer.class, CallbackMethod.PERSISTED, PersistedCallbackFacet.class);
+    }
+
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java
new file mode 100644
index 0000000..2f8863e
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java
@@ -0,0 +1,76 @@
+/*
+ *  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.object.callback;
+
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacet;
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacetFactory;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
+
+public class PersistingCallbackFacetFactoryTest
+extends CallbackFacetFactoryTestAbstract {
+
+    private PersistingCallbackFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new PersistingCallbackFacetFactory(metaModelContext);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testPersistingLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void persisting() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTING, PersistingCallbackFacet.class);
+    }
+
+    public void testSavingLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void saving() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTING, PersistingCallbackFacet.class);
+    }
+
+    public void testSavingAndPersistingLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void saving() {
+            }
+
+            @SuppressWarnings("unused")
+            public void persisting() {
+            }
+        }
+
+        assertPicksUp(2, facetFactory, Customer.class, CallbackMethod.PERSISTING, PersistingCallbackFacet.class);
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemoveAndDeleteCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemoveAndDeleteCallbackFacetFactoryTest.java
deleted file mode 100644
index 239fd66..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemoveAndDeleteCallbackFacetFactoryTest.java
+++ /dev/null
@@ -1,85 +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.object.callback;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackViaDeleteMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacetViaMethod;
-
-import lombok.val;
-
-public class RemoveAndDeleteCallbackFacetFactoryTest
-extends AbstractFacetFactoryTest {
-
-    private RemoveCallbackFacetFactory removeFacetFactory;
-    private RemoveCallbackViaDeleteMethodFacetFactory deleteFacetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        removeFacetFactory = new RemoveCallbackFacetFactory(metaModelContext);
-        deleteFacetFactory = new RemoveCallbackViaDeleteMethodFacetFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        removeFacetFactory = null;
-        deleteFacetFactory = null;
-        super.tearDown();
-    }
-
-    public void testSavingAndPersistingLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void deleting() {
-            };
-
-            @SuppressWarnings("unused")
-            public void removing() {
-            };
-        }
-        final Method deleteMethod = findMethod(Customer.class, "deleting");
-        final Method removeMethod = findMethod(Customer.class, "removing");
-
-        removeFacetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-        deleteFacetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(RemovingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof RemovingCallbackFacetViaMethod);
-        final RemovingCallbackFacetViaMethod removingCallbackFacetViaMethod = (RemovingCallbackFacetViaMethod) facet;
-        val methods = removingCallbackFacetViaMethod.getMethods();
-        assertTrue(methods.contains(deleteMethod));
-        assertTrue(methods.contains(removeMethod));
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(deleteMethod));
-    }
-
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemoveCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java
similarity index 53%
rename from core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemoveCallbackFacetFactoryTest.java
rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java
index 9b17dc5..00bd164 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemoveCallbackFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java
@@ -19,25 +19,20 @@
 
 package org.apache.isis.core.metamodel.facets.object.callback;
 
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacetViaMethod;
+import org.apache.isis.core.metamodel.facets.object.callbacks.RemovingCallbackFacetFactory;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
 
-public class RemoveCallbackFacetFactoryTest
-extends AbstractFacetFactoryTest {
+public class RemovingCallbackFacetFactoryTest
+extends CallbackFacetFactoryTestAbstract {
 
-    private RemoveCallbackFacetFactory facetFactory;
+    private RemovingCallbackFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new RemoveCallbackFacetFactory(metaModelContext);
+        facetFactory = new RemovingCallbackFacetFactory(metaModelContext);
     }
 
     @Override
@@ -50,20 +45,30 @@ extends AbstractFacetFactoryTest {
         class Customer {
             @SuppressWarnings("unused")
             public void removing() {
-            };
+            }
         }
-        final Method method = findMethod(Customer.class, "removing");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.REMOVING, RemovingCallbackFacet.class);
+    }
 
-        final Facet facet = facetedMethod.getFacet(RemovingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof RemovingCallbackFacetViaMethod);
-        final RemovingCallbackFacetViaMethod removingCallbackFacetViaMethod = (RemovingCallbackFacetViaMethod) facet;
-        assertEquals(method, removingCallbackFacetViaMethod.getMethods().getFirstOrFail());
+    public void testDeletingLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void deleting() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.REMOVING, RemovingCallbackFacet.class);
+    }
 
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
+    public void testRemovingAndDeletingLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void removing() {
+            }
+            @SuppressWarnings("unused")
+            public void deleting() {
+            }
+        }
+        assertPicksUp(2, facetFactory, Customer.class, CallbackMethod.REMOVING, RemovingCallbackFacet.class);
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/SaveCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/SaveCallbackFacetFactoryTest.java
deleted file mode 100644
index 571cbb7..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/SaveCallbackFacetFactoryTest.java
+++ /dev/null
@@ -1,90 +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.object.callback;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackViaSaveMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistingCallbackFacetViaMethod;
-
-public class SaveCallbackFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private PersistCallbackViaSaveMethodFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new PersistCallbackViaSaveMethodFacetFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testSavingLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void saving() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "saving");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(PersistingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof PersistingCallbackFacetViaMethod);
-        final PersistingCallbackFacetViaMethod savingCallbackFacetViaMethod = (PersistingCallbackFacetViaMethod) facet;
-        assertEquals(method, savingCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-    public void testSavedLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void saved() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "saved");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(PersistedCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof PersistedCallbackFacetViaMethod);
-        final PersistedCallbackFacetViaMethod savedCallbackFacetViaMethod = (PersistedCallbackFacetViaMethod) facet;
-        assertEquals(method, savedCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdateCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdateCallbackFacetFactoryTest.java
deleted file mode 100644
index fda8de7..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdateCallbackFacetFactoryTest.java
+++ /dev/null
@@ -1,90 +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.object.callback;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdateCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacetViaMethod;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacetViaMethod;
-
-public class UpdateCallbackFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private UpdateCallbackFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new UpdateCallbackFacetFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testUpdatingLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void updating() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "updating");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(UpdatingCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof UpdatingCallbackFacetViaMethod);
-        final UpdatingCallbackFacetViaMethod updatingCallbackFacetViaMethod = (UpdatingCallbackFacetViaMethod) facet;
-        assertEquals(method, updatingCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-    public void testUpdatedLifecycleMethodPickedUpOn() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void updated() {
-            };
-        }
-        final Method method = findMethod(Customer.class, "updated");
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(UpdatedCallbackFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof UpdatedCallbackFacetViaMethod);
-        final UpdatedCallbackFacetViaMethod updatedCallbackFacetViaMethod = (UpdatedCallbackFacetViaMethod) facet;
-        assertEquals(method, updatedCallbackFacetViaMethod.getMethods().getFirstOrFail());
-
-        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java
new file mode 100644
index 0000000..dfdc2d6
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java
@@ -0,0 +1,53 @@
+/*
+ *  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.object.callback;
+
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacet;
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
+
+public class UpdatedCallbackFacetFactoryTest
+extends CallbackFacetFactoryTestAbstract {
+
+    private UpdatedCallbackFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new UpdatedCallbackFacetFactory(metaModelContext);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testUpdatedLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void updated() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.UPDATED, UpdatedCallbackFacet.class);
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java
new file mode 100644
index 0000000..4660849
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java
@@ -0,0 +1,53 @@
+/*
+ *  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.object.callback;
+
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet;
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacetFactory;
+import org.apache.isis.core.metamodel.methods.MethodLiteralConstants.CallbackMethod;
+
+public class UpdatingCallbackFacetFactoryTest
+extends CallbackFacetFactoryTestAbstract {
+
+    private UpdatingCallbackFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new UpdatingCallbackFacetFactory(metaModelContext);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testUpdatingLifecycleMethodPickedUpOn() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void updating() {
+            }
+        }
+        assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.UPDATING, UpdatingCallbackFacet.class);
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index 7cedd3a..4273a92 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -24,9 +24,6 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.commons.internal.reflection._Reflect;
@@ -36,6 +33,9 @@ import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
 import lombok.val;
 
 /**
@@ -58,7 +58,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
         programmingModel = metaModelContext.getProgrammingModel();
 
         // verify that
-        assertEquals(118, programmingModel.streamFactories().count());
+        assertEquals(119, programmingModel.streamFactories().count());
     }
 
     @Override