This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit ea0db131069ddab895f440dbc405546da4c52fe1
Author: Dan Haywood <[email protected]>
AuthorDate: Tue Jul 1 06:51:59 2025 +0100

    CAUSEWAY-3882: updates to docs, license etc for release
---
 .../modules/ROOT/pages/cutting-a-release.adoc      | 10 +--
 .../ROOT/pages/post-release-successful.adoc        |  4 +-
 .../ROOT/partials/publish-and-index-website.adoc   |  2 +-
 .../index/services/wrapper/WrapperFactory.adoc     | 80 +++++++++---------
 .../wrapper/WrapperFactory_AsyncProxy.adoc         | 24 ++++++
 .../index/services/wrapper/WrappingObject.adoc     | 57 -------------
 .../services/wrapper/callable/AsyncCallable.adoc   | 83 -------------------
 .../services/wrapper/control/AsyncControl.adoc     | 96 ++++++++++++----------
 .../services/wrapper/control/ControlAbstract.adoc  | 29 -------
 .../services/wrapper/control/ExecutionMode.adoc    | 40 ---------
 .../services/wrapper/control/SyncControl.adoc      | 45 +++++-----
 .../services/wrapper/events/ParseValueEvent.adoc   | 31 -------
 .../pages/index/runtime/wrap/WrappingObject.adoc   | 64 +++++++++++++++
 .../wrapper/WrapperFactoryDefault.adoc             | 29 -------
 .../commandlog/applib/dom/BackgroundService.adoc   |  9 +-
 ...roundService_PersistCommandExecutorService.adoc | 25 ------
 core/adoc/modules/_overview/pages/about.adoc       | 50 ++++-------
 cribsheet.adoc                                     |  2 +-
 18 files changed, 237 insertions(+), 443 deletions(-)

diff --git 
a/antora/components/comguide/modules/ROOT/pages/cutting-a-release.adoc 
b/antora/components/comguide/modules/ROOT/pages/cutting-a-release.adoc
index 80c7fe8de48..31eabbca4ef 100644
--- a/antora/components/comguide/modules/ROOT/pages/cutting-a-release.adoc
+++ b/antora/components/comguide/modules/ROOT/pages/cutting-a-release.adoc
@@ -160,7 +160,7 @@ The next step is to generate the website, ensuring that the 
config, examples, pr
 +
 [source,bash,subs="attributes+"]
 ----
-sh preview.sh
+./preview.sh
 ----
 +
 NOTE: this now runs `mvnd clean install -pl core/config` automatically.
@@ -207,8 +207,8 @@ Commit any changes from the preceding steps:
 
 [source,bash,subs="attributes+"]
 ----
-git add ..
-git commit -m "$CAUSEWAYJIRA: updates to pom.xml etc for release"
+git add .
+git commit -m "$CAUSEWAYJIRA: updates to docs, license etc for release"
 ----
 
 
@@ -786,7 +786,7 @@ popd
 ----
 cd ../causeway
 
-sh preview.sh -AB
+./preview.sh -AB
 ----
 
 * Copy the generated Antora site to `causeway-site` repo's `contents` 
directory:
@@ -805,7 +805,7 @@ cd ../causeway-site
 git add .
 git commit -m "$CAUSEWAYJIRA : staging changes to website"
 
-sh preview.sh
+./preview.sh
 ----
 
 * If happy, then push the changes:
diff --git 
a/antora/components/comguide/modules/ROOT/pages/post-release-successful.adoc 
b/antora/components/comguide/modules/ROOT/pages/post-release-successful.adoc
index 059575cc138..74918cf3176 100644
--- a/antora/components/comguide/modules/ROOT/pages/post-release-successful.adoc
+++ b/antora/components/comguide/modules/ROOT/pages/post-release-successful.adoc
@@ -362,7 +362,7 @@ popd
 +
 [source,bash,subs="attributes+"]
 ----
-sh preview.sh
+./preview.sh
 ----
 
 * if any files have changed, then commit:
@@ -448,7 +448,7 @@ git commit -m "$CAUSEWAYJIRA: updates site.yml in readiness 
for website generati
 +
 [source,bash,subs="attributes+"]
 ----
-sh preview.sh -AS
+./preview.sh -AS
 ----
 +
 This will write to `antora/target/site`; we'll use the results in the 
xref:#publish-website[next section].
diff --git 
a/antora/components/comguide/modules/ROOT/partials/publish-and-index-website.adoc
 
b/antora/components/comguide/modules/ROOT/partials/publish-and-index-website.adoc
index 2438a02670f..461e63ab8ba 100644
--- 
a/antora/components/comguide/modules/ROOT/partials/publish-and-index-website.adoc
+++ 
b/antora/components/comguide/modules/ROOT/partials/publish-and-index-website.adoc
@@ -45,7 +45,7 @@ git add .
 ----
 git commit -m "updates website"
 
-sh preview.sh
+./preview.sh
 ----
 
 * If everything looks ok, then push the changes to make live, and switch back 
to the `causeway` repo:
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory.adoc
index e6c7b1deb70..8326f693b4a 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory.adoc
@@ -31,46 +31,46 @@ interface WrapperFactory {
   T wrap(T domainObject, SyncControl syncControl)     // <.>
   T wrap(T domainObject)     // <.>
   T wrapMixin(Class<T> mixinClass, Object mixee, SyncControl syncControl)     
// <.>
-  T wrapMixinT(Class<T> mixinClass, MIXEE mixee, SyncControl syncControl)     
// <.>
   T wrapMixin(Class<T> mixinClass, Object mixee)     // <.>
+  T wrapMixinT(Class<T> mixinClass, MIXEE mixee, SyncControl syncControl)     
// <.>
   T wrapMixinT(Class<T> mixinClass, MIXEE mixee)     // <.>
   T unwrap(T possibleWrappedDomainObject)     // <.>
   boolean isWrapper(T possibleWrappedDomainObject)     // <.>
-  T asyncWrap(T domainObject, AsyncControl<R> asyncControl)     // <.>
-  T asyncWrapMixin(Class<T> mixinClass, Object mixee, AsyncControl<R> 
asyncControl)     // <.>
-  T asyncWrapMixinT(Class<T> mixinClass, MIXEE mixee, AsyncControl<R> 
asyncControl)     // <.>
+  AsyncProxy<T> asyncWrap(T domainObject, AsyncControl asyncControl)     // <.>
+  AsyncProxy<T> asyncWrap(T domainObject)     // <.>
+  AsyncProxy<T> asyncWrapMixin(Class<T> mixinClass, Object mixee, AsyncControl 
asyncControl)     // <.>
+  AsyncProxy<T> asyncWrapMixin(Class<T> mixinClass, Object mixee)     // <.>
   List<InteractionListener> getListeners()     // <.>
   boolean addInteractionListener(InteractionListener listener)     // <.>
   boolean removeInteractionListener(InteractionListener listener)     // <.>
   void notifyListeners(InteractionEvent ev)
-  R execute(AsyncCallable<R> asyncCallable)     // <.>
 }
 ----
 
 <.> xref:#wrap_T_SyncControl[wrap(T, SyncControl)]
 +
 --
-Provides the "wrapper" of a domain object against which to invoke the action.
+Provides the'wrapper' of a domain object against which to invoke the action.
 --
 <.> xref:#wrap_T[wrap(T)]
 +
 --
-A convenience overload for _#wrap(Object, SyncControl)_ , returning a wrapper 
to invoke the action synchronously, enforcing business rules. Any exceptions 
will be propagated, not swallowed.
+A convenience overload for _#wrap(Object, SyncControl)_ with 
_SyncControl.defaults()_ .
 --
 <.> xref:#wrapMixin_Class_Object_SyncControl[wrapMixin(Class, Object, 
SyncControl)]
 +
 --
 Provides the wrapper for a _FactoryService#mixin(Class, Object) mixin_ , 
against which to invoke the action.
 --
-<.> xref:#wrapMixinT_Class_MIXEE_SyncControl[wrapMixinT(Class, MIXEE, 
SyncControl)]
+<.> xref:#wrapMixin_Class_Object[wrapMixin(Class, Object)]
 +
 --
-Provides the wrapper for a _Mixin typesafe_ _FactoryService#mixin(Class, 
Object) mixin_ , against which to invoke the action.
+A convenience overload for _#wrapMixin(Class, Object, SyncControl)_ with 
_SyncControl.defaults()_ .
 --
-<.> xref:#wrapMixin_Class_Object[wrapMixin(Class, Object)]
+<.> xref:#wrapMixinT_Class_MIXEE_SyncControl[wrapMixinT(Class, MIXEE, 
SyncControl)]
 +
 --
-A convenience overload for _#wrapMixin(Class, Object, SyncControl)_ , 
returning a wrapper to invoke the action synchronously, enforcing business 
rules. Any exceptions will be propagated, not swallowed.
+Provides the wrapper for a _Mixin typesafe_ _FactoryService#mixin(Class, 
Object) mixin_ , against which to invoke the action.
 --
 <.> xref:#wrapMixinT_Class_MIXEE[wrapMixinT(Class, MIXEE)]
 +
@@ -90,17 +90,22 @@ Whether the supplied object is a wrapper around a domain 
object.
 <.> xref:#asyncWrap_T_AsyncControl[asyncWrap(T, AsyncControl)]
 +
 --
-Returns a proxy object for the provided _domainObject_ , through which can 
execute the action asynchronously (in another thread).
+Returns a _CompletableFuture_ holding a proxy object for the provided 
_domainObject_ , through which one can execute the action asynchronously (in 
another thread).
+--
+<.> xref:#asyncWrap_T[asyncWrap(T)]
++
+--
+A convenience overload for _#asyncWrap(Object, AsyncControl)_ with 
_AsyncControl.defaults()_ .
 --
 <.> xref:#asyncWrapMixin_Class_Object_AsyncControl[asyncWrapMixin(Class, 
Object, AsyncControl)]
 +
 --
-Returns a proxy object for the provided _mixinClass_ , through which can 
execute the action asynchronously (in another thread).
+Returns a _AsyncProxy_ holding a proxy object for the provided _mixinClass_ , 
through which one can execute the action asynchronously (in another thread).
 --
-<.> xref:#asyncWrapMixinT_Class_MIXEE_AsyncControl[asyncWrapMixinT(Class, 
MIXEE, AsyncControl)]
+<.> xref:#asyncWrapMixin_Class_Object[asyncWrapMixin(Class, Object)]
 +
 --
-Returns a proxy object for the provided _mixinClass_ , through which can 
execute the action asynchronously (in another thread).
+A convenience overload for _#asyncWrapMixin(Class, Object, AsyncControl)_ with 
_AsyncControl.defaults()_ .
 --
 <.> xref:#getListeners_[getListeners()]
 +
@@ -117,18 +122,13 @@ Registers an 
xref:refguide:applib:index/services/wrapper/listeners/InteractionLi
 --
 Remove an 
xref:refguide:applib:index/services/wrapper/listeners/InteractionListener.adoc[InteractionListener]
 , to no longer be notified of interactions on wrappers.
 --
-<.> xref:#execute_AsyncCallable[execute(AsyncCallable)]
-+
---
-Provides a mechanism for custom implementations of 
_java.util.concurrent.ExecutorService_ , as installed using 
_AsyncControl#with(ExecutorService)_ , to actually execute the 
xref:refguide:applib:index/services/wrapper/callable/AsyncCallable.adoc[AsyncCallable]
 that they are passed initially during _WrapperFactory#asyncWrap(Object, 
AsyncControl)_ and its brethren.
---
 
 == Members
 
 [#wrap_T_SyncControl]
 === wrap(T, SyncControl)
 
-Provides the "wrapper" of a domain object against which to invoke the action.
+Provides the'wrapper' of a domain object against which to invoke the action.
 
 The provided 
xref:refguide:applib:index/services/wrapper/control/SyncControl.adoc[SyncControl]
 determines whether business rules are checked first, and conversely whether 
the action is executed. There are therefore three typical cases:
 
@@ -140,17 +140,26 @@ The last logical option (skip rules, skip action) is 
valid but doesn't make sens
 
 Otherwise, will do all the validations (raise exceptions as required etc.), 
but doesn't modify the model.
 
+Any exceptions will be propagated, not swallowed.
+
 [#wrap_T]
 === wrap(T)
 
-A convenience overload for _#wrap(Object, SyncControl)_ , returning a wrapper 
to invoke the action synchronously, enforcing business rules. Any exceptions 
will be propagated, not swallowed.
+A convenience overload for _#wrap(Object, SyncControl)_ with 
_SyncControl.defaults()_ .
 
 [#wrapMixin_Class_Object_SyncControl]
 === wrapMixin(Class, Object, SyncControl)
 
 Provides the wrapper for a _FactoryService#mixin(Class, Object) mixin_ , 
against which to invoke the action.
 
-The provided 
xref:refguide:applib:index/services/wrapper/control/SyncControl.adoc[SyncControl]
 determines whether business rules are checked first, and conversely whether 
the action is executed. See _#wrap(Object, SyncControl)_ for more details on 
this.
+The provided 
xref:refguide:applib:index/services/wrapper/control/SyncControl.adoc[SyncControl]
 determines whether business rules are checked first, and conversely whether 
the action is executed.
+
+Any exceptions will be propagated, not swallowed.
+
+[#wrapMixin_Class_Object]
+=== wrapMixin(Class, Object)
+
+A convenience overload for _#wrapMixin(Class, Object, SyncControl)_ with 
_SyncControl.defaults()_ .
 
 [#wrapMixinT_Class_MIXEE_SyncControl]
 === wrapMixinT(Class, MIXEE, SyncControl)
@@ -159,11 +168,6 @@ Provides the wrapper for a _Mixin typesafe_ 
_FactoryService#mixin(Class, Object)
 
 The provided 
xref:refguide:applib:index/services/wrapper/control/SyncControl.adoc[SyncControl]
 determines whether business rules are checked first, and conversely whether 
the action is executed. See _#wrap(Object, SyncControl)_ for more details on 
this.
 
-[#wrapMixin_Class_Object]
-=== wrapMixin(Class, Object)
-
-A convenience overload for _#wrapMixin(Class, Object, SyncControl)_ , 
returning a wrapper to invoke the action synchronously, enforcing business 
rules. Any exceptions will be propagated, not swallowed.
-
 [#wrapMixinT_Class_MIXEE]
 === wrapMixinT(Class, MIXEE)
 
@@ -184,17 +188,22 @@ Whether the supplied object is a wrapper around a domain 
object.
 [#asyncWrap_T_AsyncControl]
 === asyncWrap(T, AsyncControl)
 
-Returns a proxy object for the provided _domainObject_ , through which can 
execute the action asynchronously (in another thread).
+Returns a _CompletableFuture_ holding a proxy object for the provided 
_domainObject_ , through which one can execute the action asynchronously (in 
another thread).
+
+[#asyncWrap_T]
+=== asyncWrap(T)
+
+A convenience overload for _#asyncWrap(Object, AsyncControl)_ with 
_AsyncControl.defaults()_ .
 
 [#asyncWrapMixin_Class_Object_AsyncControl]
 === asyncWrapMixin(Class, Object, AsyncControl)
 
-Returns a proxy object for the provided _mixinClass_ , through which can 
execute the action asynchronously (in another thread).
+Returns a _AsyncProxy_ holding a proxy object for the provided _mixinClass_ , 
through which one can execute the action asynchronously (in another thread).
 
-[#asyncWrapMixinT_Class_MIXEE_AsyncControl]
-=== asyncWrapMixinT(Class, MIXEE, AsyncControl)
+[#asyncWrapMixin_Class_Object]
+=== asyncWrapMixin(Class, Object)
 
-Returns a proxy object for the provided _mixinClass_ , through which can 
execute the action asynchronously (in another thread).
+A convenience overload for _#asyncWrapMixin(Class, Object, AsyncControl)_ with 
_AsyncControl.defaults()_ .
 
 [#getListeners_]
 === getListeners()
@@ -215,11 +224,6 @@ Remove an 
xref:refguide:applib:index/services/wrapper/listeners/InteractionListe
 
 This is retrospective: the listener will no longer be notified of any 
interactions created on any wrappers, not just on those wrappers created 
subsequently. (From an implementation perspective this is because the wrappers 
delegate back to the container to fire the events).
 
-[#execute_AsyncCallable]
-=== execute(AsyncCallable)
-
-Provides a mechanism for custom implementations of 
_java.util.concurrent.ExecutorService_ , as installed using 
_AsyncControl#with(ExecutorService)_ , to actually execute the 
xref:refguide:applib:index/services/wrapper/callable/AsyncCallable.adoc[AsyncCallable]
 that they are passed initially during _WrapperFactory#asyncWrap(Object, 
AsyncControl)_ and its brethren.
-
 include::hooks/WrapperFactory_010-implementation.adoc[]
 
 include::hooks/WrapperFactory_020-examples-and-usage.adoc[]
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory_AsyncProxy.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory_AsyncProxy.adoc
new file mode 100644
index 00000000000..0bcef02826e
--- /dev/null
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrapperFactory_AsyncProxy.adoc
@@ -0,0 +1,24 @@
+= WrapperFactory.AsyncProxy
+:Notice: 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 ag [...]
+
+The result of an async proxy instantiation, that allows to submit an async 
invocation on the wrapped domain object.
+
+The framework takes care, that an async invocation is scoped within both an 
interaction-context and a transaction. Further more, _TryFuture_ 's success 
values are unwrapped and detached.
+
+Terminology:
+
+* interaction-context: who/how/when 
xref:refguide:applib:index/services/iactnlayer/InteractionContext.adoc[InteractionContext]
+* unwrapped: plain object, not proxied _WrapperFactory#unwrap_
+* detached: object not attached to a persistence session (applicable to 
entities only) _RepositoryService#detach(Object)_
+
+== API
+
+[source,java]
+.WrapperFactory_AsyncProxy.java
+----
+interface AsyncProxy<T> {
+  TryFuture<Void> acceptAsync(ThrowingConsumer<? super T> action)
+  TryFuture<U> applyAsync(ThrowingFunction<? super T, ? extends U> fn)
+}
+----
+
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrappingObject.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrappingObject.adoc
deleted file mode 100644
index 12605169377..00000000000
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/WrappingObject.adoc
+++ /dev/null
@@ -1,57 +0,0 @@
-= WrappingObject
-:Notice: 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 ag [...]
-
-Implemented by all objects that have been viewed as per 
_WrapperFactory#wrap(Object)_ .
-
-== API
-
-[source,java]
-.WrappingObject.java
-----
-interface WrappingObject {
-  void __causeway_save()     // <.>
-  Object __causeway_wrapped()     // <.>
-  ImmutableEnumSet<ExecutionMode> __causeway_executionModes()     // <.>
-}
-----
-
-<.> xref:#__causeway_save_[__causeway_save()]
-+
---
-Programmatic equivalent of invoking save for a transient object .
---
-<.> xref:#__causeway_wrapped_[__causeway_wrapped()]
-+
---
-Provide access to the underlying, wrapped object.
---
-<.> xref:#__causeway_executionModes_[__causeway_executionModes()]
-+
---
-The 
xref:refguide:applib:index/services/wrapper/control/ExecutionMode.adoc[ExecutionMode]
 (s) inferred from the 
xref:refguide:applib:index/services/wrapper/control/SyncControl.adoc[SyncControl]
 with which this wrapper was _WrapperFactory#wrap(Object, SyncControl) created_ 
.
---
-
-== Members
-
-[#__causeway_save_]
-=== __causeway_save()
-
-Programmatic equivalent of invoking save for a transient object .
-
-NOTE: domain classes may not have a method with this name. The `__causeway_` 
prefix is intended to reduce the risk of a collision.
-
-[#__causeway_wrapped_]
-=== __causeway_wrapped()
-
-Provide access to the underlying, wrapped object.
-
-Used to unwrap objects used as arguments to actions (otherwise, end up 
creating a `ObjectSpecification` for the Javassist-enhanced class, not the 
original class).
-
-NOTE: domain classes may not have a method with this name. The `__causeway_` 
prefix is intended to reduce the risk of a collision.
-
- *NOTE: there is a string-literal reference to this name 
`DomainObjectInvocationHandler` , so it should not be changed.* .
-
-[#__causeway_executionModes_]
-=== __causeway_executionModes()
-
-The 
xref:refguide:applib:index/services/wrapper/control/ExecutionMode.adoc[ExecutionMode]
 (s) inferred from the 
xref:refguide:applib:index/services/wrapper/control/SyncControl.adoc[SyncControl]
 with which this wrapper was _WrapperFactory#wrap(Object, SyncControl) created_ 
.
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/callable/AsyncCallable.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/callable/AsyncCallable.adoc
deleted file mode 100644
index 15de3cdf653..00000000000
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/callable/AsyncCallable.adoc
+++ /dev/null
@@ -1,83 +0,0 @@
-= AsyncCallable
-:Notice: 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 ag [...]
-
-Provides access to the details of the asynchronous callable (representing a 
child command to be executed asynchronously) when using 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#asyncWrap(Object, 
AsyncControl)_ and its brethren.
-
-To explain in a little more depth; we can execute commands (actions etc) 
asynchronously using 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#asyncWrap(Object, 
AsyncControl)_ or similar. The 
xref:refguide:applib:index/services/wrapper/control/AsyncControl.adoc[AsyncControl]
 parameter allows various aspects of this to be controlled, one such being the 
implementation of the _java.util.concurrent.ExecutorService_ (using 
_AsyncControl#with(ExecutorService)_ ).
-
-The default _ExecutorService_ is just _java.util.concurrent.ForkJoinPool_ , 
and this and similar implementations will hold the provided callable in memory 
and execute it in due course. For these out-of-the-box implementations, the 
_java.util.concurrent.Callable_ is a black box and they have no need to look 
inside it. So long as the implementation of the Callable is not serialized then 
deserialized (ie is only ever held in memory), then all will work fine.
-
-This interface, though, is intended to expose the details of the passed 
_java.util.concurrent.Callable_ , most notably the _CommandDto_ to be executed. 
The main use case this supports is to allow a custom implementation of 
_ExecutorService_ to be provided that could do more sophisticated things, for 
example persisting the callable somewhere, either exploiting the fact that the 
object is serializable, or perhaps by unpacking the parts and persisting (for 
example, as a `CommandLogEntry` co [...]
-
-These custom implementations of _ExecutorService_ must however reinitialize 
the state of the callable, either by injecting in services using 
_org.apache.causeway.applib.services.inject.ServiceInjector_ and then just 
`call()` ing it, or alternatively and more straightforwardly simply executing 
it using 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#execute(AsyncCallable)_
 .
-
-== API
-
-[source,java]
-.AsyncCallable.java
-----
-interface AsyncCallable<R> {
-  InteractionContext getInteractionContext()     // <.>
-  Propagation getPropagation()     // <.>
-  CommandDto getCommandDto()     // <.>
-  Class<R> getReturnType()     // <.>
-  UUID getParentInteractionId()     // <.>
-}
-----
-
-<.> xref:#getInteractionContext_[getInteractionContext()]
-+
---
-The requested 
xref:refguide:applib:index/services/iactnlayer/InteractionContext.adoc[InteractionContext]
 to execute the command, as inferred from the 
xref:refguide:applib:index/services/wrapper/control/AsyncControl.adoc[AsyncControl]
 that was used to call 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#asyncWrap(Object, 
AsyncControl)_ and its ilk.
---
-<.> xref:#getPropagation_[getPropagation()]
-+
---
-The transaction propagation to use when creating a new 
_org.apache.causeway.applib.services.iactn.Interaction_ in which to execute the 
child command.
---
-<.> xref:#getCommandDto_[getCommandDto()]
-+
---
-Details of the actual child command (action or property edit) to be performed.
---
-<.> xref:#getReturnType_[getReturnType()]
-+
---
-The type of the object returned by the child command once finally executed.
---
-<.> xref:#getParentInteractionId_[getParentInteractionId()]
-+
---
-The unique _Command#getInteractionId() interactionId_ of the parent 
xref:refguide:applib:index/services/command/Command.adoc[Command] , which is to 
say the xref:refguide:applib:index/services/command/Command.adoc[Command] that 
was active in the original interaction where 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#asyncWrap(Object, 
AsyncControl)_ (or its brethren) was called.
---
-
-== Members
-
-[#getInteractionContext_]
-=== getInteractionContext()
-
-The requested 
xref:refguide:applib:index/services/iactnlayer/InteractionContext.adoc[InteractionContext]
 to execute the command, as inferred from the 
xref:refguide:applib:index/services/wrapper/control/AsyncControl.adoc[AsyncControl]
 that was used to call 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#asyncWrap(Object, 
AsyncControl)_ and its ilk.
-
-[#getPropagation_]
-=== getPropagation()
-
-The transaction propagation to use when creating a new 
_org.apache.causeway.applib.services.iactn.Interaction_ in which to execute the 
child command.
-
-[#getCommandDto_]
-=== getCommandDto()
-
-Details of the actual child command (action or property edit) to be performed.
-
-(Ultimately this is handed onto the 
_org.apache.causeway.applib.services.command.CommandExecutorService_ ).
-
-[#getReturnType_]
-=== getReturnType()
-
-The type of the object returned by the child command once finally executed.
-
-[#getParentInteractionId_]
-=== getParentInteractionId()
-
-The unique _Command#getInteractionId() interactionId_ of the parent 
xref:refguide:applib:index/services/command/Command.adoc[Command] , which is to 
say the xref:refguide:applib:index/services/command/Command.adoc[Command] that 
was active in the original interaction where 
_org.apache.causeway.applib.services.wrapper.WrapperFactory#asyncWrap(Object, 
AsyncControl)_ (or its brethren) was called.
-
-This can be useful for custom implementations of _ExecutorService_ that use 
the commandlog extension's `CommandLogEntry` , to link parent and child 
commands together.
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/AsyncControl.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/AsyncControl.adoc
index 5d083ddd205..dfe4edeec0f 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/AsyncControl.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/AsyncControl.adoc
@@ -1,4 +1,4 @@
-= AsyncControl
+= AsyncControl _(record)_
 :Notice: 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 ag [...]
 
 Modifies the way in which an asynchronous action initiated through the 
xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] 
is actually executed.
@@ -10,37 +10,39 @@ Executing in a separate thread means that the target and 
arguments are used in a
 [source,java]
 .AsyncControl.java
 ----
-class AsyncControl<R> {
-  AsyncControl<Void> returningVoid()     // <.>
-  AsyncControl<X> returning(Class<X> cls)     // <.>
-  AsyncControl<R> withSkipRules()     // <.>
-  AsyncControl<R> with(ExceptionHandler exceptionHandler)     // <.>
-  AsyncControl<R> with(ExecutorService executorService)     // <.>
-  AsyncControl<R> withClock(VirtualClock clock)
-  AsyncControl<R> withLocale(Locale locale)
-  AsyncControl<R> withTimeZone(ZoneId timeZone)
-  AsyncControl<R> withUser(UserMemento user)     // <.>
-  void setFuture(Future<R> future)     // <.>
-  R waitForResult(long timeout, TimeUnit unit)     // <.>
+record AsyncControl {
+  AsyncControl defaults()
+  AsyncControl withExecute()     // <.>
+  AsyncControl withNoExecute()     // <.>
+  AsyncControl withSkipRules()     // <.>
+  AsyncControl withCheckRules()
+  AsyncControl withExceptionHandler(ExceptionHandler exceptionHandler)     // 
<.>
+  AsyncControl with(ExecutorService executorService)     // <.>
+  AsyncControl listen(SyncControl.@NonNull CommandListener commandListener)
+  AsyncControl withClock(VirtualClock clock)     // <.>
+  AsyncControl withLocale(Locale locale)     // <.>
+  AsyncControl withTimeZone(ZoneId timeZone)     // <.>
+  AsyncControl withUser(UserMemento user)     // <.>
+  InteractionContext override(InteractionContext interactionContext)
 }
 ----
 
-<.> xref:#returningVoid_[returningVoid()]
+<.> xref:#withExecute_[withExecute()]
 +
 --
-Factory method to instantiate a control instance for a void action or a 
property edit (where there is no need or intention to provide a return value 
through the `Future`).
+Explicitly set the action to be executed.
 --
-<.> xref:#returning_Class[returning(Class)]
+<.> xref:#withNoExecute_[withNoExecute()]
 +
 --
-Factory method to instantiate for a control instance for an action returning a 
value of `` (where this value will be returned through the `Future`).
+Explicitly set the action to _not_ be executed, in other words a 'dry run'.
 --
 <.> xref:#withSkipRules_[withSkipRules()]
 +
 --
 Skip checking business rules (hide/disable/validate) before executing the 
underlying property or action
 --
-<.> xref:#with_ExceptionHandler[with(ExceptionHandler)]
+<.> 
xref:#withExceptionHandler_ExceptionHandler[withExceptionHandler(ExceptionHandler)]
 +
 --
 How to handle exceptions if they occur, using the provided 
xref:refguide:applib:index/services/wrapper/control/ExceptionHandler.adoc[ExceptionHandler]
 .
@@ -50,41 +52,46 @@ How to handle exceptions if they occur, using the provided 
xref:refguide:applib:
 --
 Specifies the _ExecutorService_ to use to obtain the thread to invoke the 
action.
 --
-<.> xref:#withUser_UserMemento[withUser(UserMemento)]
+<.> xref:#withClock_VirtualClock[withClock(VirtualClock)]
 +
 --
-Specifies the user for the session used to execute the command asynchronously, 
in the background.
+Defaults to the system clock, if not overridden
 --
-<.> xref:#setFuture_Future[setFuture(Future)]
+<.> xref:#withLocale_Locale[withLocale(Locale)]
 +
 --
-For framework use only.
+Defaults to the system locale, if not overridden
 --
-<.> xref:#waitForResult_long_TimeUnit[waitForResult(long, TimeUnit)]
+<.> xref:#withTimeZone_ZoneId[withTimeZone(ZoneId)]
 +
 --
-Waits on the callers thread, for a maximum amount of time, for the result of 
the invocation to become available.
+Defaults to the system time zone, if not overridden
+--
+<.> xref:#withUser_UserMemento[withUser(UserMemento)]
++
+--
+Specifies the user for the session used to execute the command asynchronously, 
in the background.
 --
 
 == Members
 
-[#returningVoid_]
-=== returningVoid()
+[#withExecute_]
+=== withExecute()
 
-Factory method to instantiate a control instance for a void action or a 
property edit (where there is no need or intention to provide a return value 
through the `Future`).
+Explicitly set the action to be executed.
 
-[#returning_Class]
-=== returning(Class)
+[#withNoExecute_]
+=== withNoExecute()
 
-Factory method to instantiate for a control instance for an action returning a 
value of `` (where this value will be returned through the `Future`).
+Explicitly set the action to _not_ be executed, in other words a 'dry run'.
 
 [#withSkipRules_]
 === withSkipRules()
 
 Skip checking business rules (hide/disable/validate) before executing the 
underlying property or action
 
-[#with_ExceptionHandler]
-=== with(ExceptionHandler)
+[#withExceptionHandler_ExceptionHandler]
+=== withExceptionHandler(ExceptionHandler)
 
 How to handle exceptions if they occur, using the provided 
xref:refguide:applib:index/services/wrapper/control/ExceptionHandler.adoc[ExceptionHandler]
 .
 
@@ -97,19 +104,24 @@ Specifies the _ExecutorService_ to use to obtain the 
thread to invoke the action
 
 The default is _null_ , indicating, that its the 
xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] 
's responsibility to provide a suitable _ExecutorService_ .
 
-[#withUser_UserMemento]
-=== withUser(UserMemento)
+[#withClock_VirtualClock]
+=== withClock(VirtualClock)
 
-Specifies the user for the session used to execute the command asynchronously, 
in the background.
+Defaults to the system clock, if not overridden
 
-If not specified, then the user of the current foreground session is used.
+[#withLocale_Locale]
+=== withLocale(Locale)
+
+Defaults to the system locale, if not overridden
+
+[#withTimeZone_ZoneId]
+=== withTimeZone(ZoneId)
 
-[#setFuture_Future]
-=== setFuture(Future)
+Defaults to the system time zone, if not overridden
 
-For framework use only.
+[#withUser_UserMemento]
+=== withUser(UserMemento)
 
-[#waitForResult_long_TimeUnit]
-=== waitForResult(long, TimeUnit)
+Specifies the user for the session used to execute the command asynchronously, 
in the background.
 
-Waits on the callers thread, for a maximum amount of time, for the result of 
the invocation to become available.
+If not specified, then the user of the current foreground session is used.
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/ControlAbstract.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/ControlAbstract.adoc
deleted file mode 100644
index 36f827033da..00000000000
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/ControlAbstract.adoc
+++ /dev/null
@@ -1,29 +0,0 @@
-= ControlAbstract
-:Notice: 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 ag [...]
-
-== API
-
-[source,java]
-.ControlAbstract.java
-----
-class ControlAbstract<T> {
-  T withCheckRules()
-  T withSkipRules()
-  Optional<ExceptionHandler> getExceptionHandler()
-  T with(ExceptionHandler exceptionHandler)
-  ImmutableEnumSet<ExecutionMode> getExecutionModes()     // <.>
-}
-----
-
-<.> xref:#getExecutionModes_[getExecutionModes()]
-+
---
-Not API.
---
-
-== Members
-
-[#getExecutionModes_]
-=== getExecutionModes()
-
-Not API.
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/ExecutionMode.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/ExecutionMode.adoc
deleted file mode 100644
index 5f876d4baa1..00000000000
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/ExecutionMode.adoc
+++ /dev/null
@@ -1,40 +0,0 @@
-= ExecutionMode _(enum)_
-:Notice: 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 ag [...]
-
-Whether interactions with the wrapper are actually passed onto the underlying 
domain object.
-
-== API
-
-[source,java]
-.ExecutionMode.java
-----
-enum ExecutionMode {
-  SKIP_RULE_VALIDATION     // <.>
-  SKIP_EXECUTION     // <.>
-}
-----
-
-<.> xref:#SKIP_RULE_VALIDATION[SKIP_RULE_VALIDATION]
-+
---
-Skip all business rules.
---
-<.> xref:#SKIP_EXECUTION[SKIP_EXECUTION]
-+
---
-Skip actual execution.
---
-
-== Members
-
-[#SKIP_RULE_VALIDATION]
-=== SKIP_RULE_VALIDATION
-
-Skip all business rules.
-
-[#SKIP_EXECUTION]
-=== SKIP_EXECUTION
-
-Skip actual execution.
-
-This is not supported for _WrapperFactory#asyncWrap(Object, AsyncControl)_ ; 
instead just invoke _WrapperFactory#wrap(Object, SyncControl)_ .
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/SyncControl.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/SyncControl.adoc
index 10af591b5ab..fa1c2beb5c2 100644
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/SyncControl.adoc
+++ 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/control/SyncControl.adoc
@@ -1,4 +1,4 @@
-= SyncControl
+= SyncControl _(record)_
 :Notice: 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 ag [...]
 
 Controls the way that a (synchronous) wrapper works.
@@ -8,13 +8,16 @@ Controls the way that a (synchronous) wrapper works.
 [source,java]
 .SyncControl.java
 ----
-class SyncControl {
-  SyncControl control()
+record SyncControl {
+  SyncControl(boolean isSkipRules, boolean isSkipExecute, Can<CommandListener> 
commandListeners, ExceptionHandler exceptionHandler)
+  SyncControl defaults()
   SyncControl withSkipRules()     // <.>
-  SyncControl with(ExceptionHandler exceptionHandler)     // <.>
+  SyncControl withCheckRules()
   SyncControl withExecute()     // <.>
   SyncControl withNoExecute()     // <.>
-  ImmutableEnumSet<ExecutionMode> getExecutionModes()     // <.>
+  SyncControl listen(CommandListener commandListener)
+  SyncControl withExceptionHandler(ExceptionHandler exceptionHandler)     // 
<.>
+  boolean isEquivalent(SyncControl other)     // <.>
 }
 ----
 
@@ -23,11 +26,6 @@ class SyncControl {
 --
 Skip checking business rules (hide/disable/validate) before executing the 
underlying property or action
 --
-<.> xref:#with_ExceptionHandler[with(ExceptionHandler)]
-+
---
-How to handle exceptions if they occur, using the provided 
xref:refguide:applib:index/services/wrapper/control/ExceptionHandler.adoc[ExceptionHandler]
 .
---
 <.> xref:#withExecute_[withExecute()]
 +
 --
@@ -36,13 +34,14 @@ Explicitly set the action to be executed.
 <.> xref:#withNoExecute_[withNoExecute()]
 +
 --
-Explicitly set the action to _not_ be executed, in other words a "dry run".
+Explicitly set the action to _not_ be executed, in other words a 'dry run'.
 --
-<.> xref:#getExecutionModes_[getExecutionModes()]
+<.> 
xref:#withExceptionHandler_ExceptionHandler[withExceptionHandler(ExceptionHandler)]
 +
 --
-Not API.
+How to handle exceptions if they occur, using the provided 
xref:refguide:applib:index/services/wrapper/control/ExceptionHandler.adoc[ExceptionHandler]
 .
 --
+<.> xref:#isEquivalent_SyncControl[isEquivalent(SyncControl)]
 
 == Members
 
@@ -51,13 +50,6 @@ Not API.
 
 Skip checking business rules (hide/disable/validate) before executing the 
underlying property or action
 
-[#with_ExceptionHandler]
-=== with(ExceptionHandler)
-
-How to handle exceptions if they occur, using the provided 
xref:refguide:applib:index/services/wrapper/control/ExceptionHandler.adoc[ExceptionHandler]
 .
-
-The default behaviour is to rethrow the exception.
-
 [#withExecute_]
 === withExecute()
 
@@ -66,9 +58,14 @@ Explicitly set the action to be executed.
 [#withNoExecute_]
 === withNoExecute()
 
-Explicitly set the action to _not_ be executed, in other words a "dry run".
+Explicitly set the action to _not_ be executed, in other words a 'dry run'.
+
+[#withExceptionHandler_ExceptionHandler]
+=== withExceptionHandler(ExceptionHandler)
 
-[#getExecutionModes_]
-=== getExecutionModes()
+How to handle exceptions if they occur, using the provided 
xref:refguide:applib:index/services/wrapper/control/ExceptionHandler.adoc[ExceptionHandler]
 .
+
+The default behaviour is to rethrow the exception.
 
-Not API.
+[#isEquivalent_SyncControl]
+=== isEquivalent(SyncControl)
diff --git 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/events/ParseValueEvent.adoc
 
b/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/events/ParseValueEvent.adoc
deleted file mode 100644
index 659f94fa3d2..00000000000
--- 
a/antora/components/refguide-index/modules/applib/pages/index/services/wrapper/events/ParseValueEvent.adoc
+++ /dev/null
@@ -1,31 +0,0 @@
-= ParseValueEvent
-:Notice: 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 ag [...]
-
-Supported only by 
xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] 
, represents a check as to whether the proposed values of the value type is 
valid.
-
-If _#getReason()_ is not `null` then provides the reason why the proposed 
value is invalid, otherwise the new value is acceptable.
-
-== API
-
-[source,java]
-.ParseValueEvent.java
-----
-class ParseValueEvent {
-  ParseValueEvent(Object source, Identifier classIdentifier, String proposed)
-  Object getSource()     // <.>
-  String getProposed()
-}
-----
-
-<.> xref:#getSource_[getSource()]
-+
---
-Will be the source provided in the _#ParseValueEvent(Object, Identifier, 
String) constructor_ if not null, otherwise will fallback to the proposed value.
---
-
-== Members
-
-[#getSource_]
-=== getSource()
-
-Will be the source provided in the _#ParseValueEvent(Object, Identifier, 
String) constructor_ if not null, otherwise will fallback to the proposed value.
diff --git 
a/antora/components/refguide-index/modules/core/pages/index/runtime/wrap/WrappingObject.adoc
 
b/antora/components/refguide-index/modules/core/pages/index/runtime/wrap/WrappingObject.adoc
new file mode 100644
index 00000000000..264b2d13cd6
--- /dev/null
+++ 
b/antora/components/refguide-index/modules/core/pages/index/runtime/wrap/WrappingObject.adoc
@@ -0,0 +1,64 @@
+= WrappingObject
+:Notice: 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 ag [...]
+
+Implemented by all objects that have been viewed as per 
_WrapperFactory#wrap(Object)_ .
+
+== API
+
+[source,java]
+.WrappingObject.java
+----
+interface WrappingObject {
+  final static String ORIGIN_GETTER_NAME;
+  final static String ORIGIN_FIELD_NAME;
+  final static String SAVE_METHOD_NAME;
+  final static List<AdditionalField> ADDITIONAL_FIELDS;
+  Origin __causeway_origin()     // <.>
+  Origin getOrigin(WrappingObject proxyObject)     // <.>
+  T withOrigin(T proxyObject, Origin origin)     // <.>
+  void __causeway_save()     // <.>
+}
+----
+
+<.> xref:#__causeway_origin_[__causeway_origin()]
++
+--
+Getter for the underlying _Origin_ .
+--
+<.> xref:#getOrigin_WrappingObject[getOrigin(WrappingObject)]
++
+--
+Getter for the underlying _Origin_ .
+--
+<.> xref:#withOrigin_T_Origin[withOrigin(T, Origin)]
++
+--
+Wither for the underlying _Origin_ .
+--
+<.> xref:#__causeway_save_[__causeway_save()]
++
+--
+Programmatic equivalent of invoking save for a transient object .
+--
+
+== Members
+
+[#__causeway_origin_]
+=== __causeway_origin()
+
+Getter for the underlying _Origin_ .
+
+[#getOrigin_WrappingObject]
+=== getOrigin(WrappingObject)
+
+Getter for the underlying _Origin_ .
+
+[#withOrigin_T_Origin]
+=== withOrigin(T, Origin)
+
+Wither for the underlying _Origin_ .
+
+[#__causeway_save_]
+=== __causeway_save()
+
+Programmatic equivalent of invoking save for a transient object .
diff --git 
a/antora/components/refguide-index/modules/core/pages/index/runtimeservices/wrapper/WrapperFactoryDefault.adoc
 
b/antora/components/refguide-index/modules/core/pages/index/runtimeservices/wrapper/WrapperFactoryDefault.adoc
deleted file mode 100644
index 8c3be020849..00000000000
--- 
a/antora/components/refguide-index/modules/core/pages/index/runtimeservices/wrapper/WrapperFactoryDefault.adoc
+++ /dev/null
@@ -1,29 +0,0 @@
-= WrapperFactoryDefault
-:Notice: 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 ag [...]
-
-Default implementation of 
xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] 
.
-
-== API
-
-[source,java]
-.WrapperFactoryDefault.java
-----
-class WrapperFactoryDefault {
-  void init()
-  void close()
-  T wrap(T domainObject)
-  T wrap(T domainObject, SyncControl syncControl)
-  T wrapMixin(Class<T> mixinClass, Object mixee)
-  T wrapMixin(Class<T> mixinClass, Object mixee, SyncControl syncControl)
-  boolean isWrapper(Object obj)
-  T unwrap(T possibleWrappedDomainObject)
-  T asyncWrap(T domainObject, AsyncControl<R> asyncControl)
-  T asyncWrapMixin(Class<T> mixinClass, Object mixee, AsyncControl<R> 
asyncControl)
-  List<InteractionListener> getListeners()
-  boolean addInteractionListener(InteractionListener listener)
-  boolean removeInteractionListener(InteractionListener listener)
-  void notifyListeners(InteractionEvent interactionEvent)
-  R execute(AsyncCallable<R> asyncCallable)
-}
-----
-
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService.adoc
index b3d9a2851df..01fd1f11fb5 100644
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService.adoc
+++ 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService.adoc
@@ -11,10 +11,11 @@ Typically this other thread of execution would be scheduled 
from quartz or simil
 .BackgroundService.java
 ----
 class BackgroundService {
-  T execute(T object)     // <.>
-  T executeSkipRules(T object)     // <.>
-  T executeMixin(Class<T> mixinClass, Object mixedIn)     // <.>
-  T executeMixinSkipRules(Class<T> mixinClass, Object mixedIn)     // <.>
+  AsyncProxy<T> execute(T object)     // <.>
+  AsyncProxy<T> executeSkipRules(T object)     // <.>
+  AsyncProxy<T> executeMixin(Class<T> mixinClass, Object mixedIn)     // <.>
+  AsyncProxy<T> executeMixinSkipRules(Class<T> mixinClass, Object mixedIn)     
// <.>
+  AsyncControl asyncControl()
 }
 ----
 
diff --git 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService_PersistCommandExecutorService.adoc
 
b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService_PersistCommandExecutorService.adoc
deleted file mode 100644
index ad5d2bc4aab..00000000000
--- 
a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/applib/dom/BackgroundService_PersistCommandExecutorService.adoc
+++ /dev/null
@@ -1,25 +0,0 @@
-= BackgroundService.PersistCommandExecutorService
-:Notice: 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 ag [...]
-
-== API
-
-[source,java]
-.BackgroundService_PersistCommandExecutorService.java
-----
-class PersistCommandExecutorService {
-  Future<T> submit(Callable<T> task)
-  Future<T> submit(Runnable task, T result)
-  Future<?> submit(Runnable task)
-  void execute(Runnable command)
-  List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
-  List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long 
timeout, TimeUnit unit)
-  T invokeAny(Collection<? extends Callable<T>> tasks)
-  T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit 
unit)
-  void shutdown()
-  List<Runnable> shutdownNow()
-  boolean awaitTermination(long timeout, TimeUnit unit)
-  boolean isShutdown()
-  boolean isTerminated()
-}
-----
-
diff --git a/core/adoc/modules/_overview/pages/about.adoc 
b/core/adoc/modules/_overview/pages/about.adoc
index f87761dded8..3995f31c01d 100644
--- a/core/adoc/modules/_overview/pages/about.adoc
+++ b/core/adoc/modules/_overview/pages/about.adoc
@@ -1076,7 +1076,7 @@ org.apache.causeway.core:causeway-schema:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:applib:index/CausewayModuleApplib.adoc[CausewayModuleApplib], 
xref:refguide:applib:index/CausewayModuleApplibChangeAndExecutionLoggers.adoc[CausewayModuleApplibChangeAndExecutionLoggers],
 
xref:refguide:applib:index/CausewayModuleApplibMixins.adoc[CausewayModuleApplibMixins],
 xref:refguide:applib:index/Identifier.adoc[Identifier], 
xref:refguide:applib:index/ViewModel.adoc[ViewModel], 
xref:refguide:applib:index/annotation/Action.adoc[Action], 
xref:refguide:applib:index/annota [...]
+xref:refguide:applib:index/CausewayModuleApplib.adoc[CausewayModuleApplib], 
xref:refguide:applib:index/CausewayModuleApplibChangeAndExecutionLoggers.adoc[CausewayModuleApplibChangeAndExecutionLoggers],
 
xref:refguide:applib:index/CausewayModuleApplibMixins.adoc[CausewayModuleApplibMixins],
 xref:refguide:applib:index/Identifier.adoc[Identifier], 
xref:refguide:applib:index/ViewModel.adoc[ViewModel], 
xref:refguide:applib:index/annotation/Action.adoc[Action], 
xref:refguide:applib:index/annota [...]
 ****
 
 |Apache Causeway Core - Code Gen (ByteBuddy)
@@ -1298,6 +1298,11 @@ 
org.apache.causeway.core:causeway-core-transaction:jar:<managed> +
 
org.apache.causeway.valuetypes:causeway-valuetypes-jodatime-integration:jar:<managed>
 +
 ****
 
+.Document Index Entries
+****
+xref:refguide:core:index/runtime/wrap/WrappingObject.adoc[WrappingObject]
+****
+
 |Apache Causeway Core - Runtime Services
 [source,yaml]
 ----
@@ -1368,7 +1373,7 @@ org.springframework:spring-context-support:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:core:index/runtimeservices/bookmarks/BookmarkServiceDefault.adoc[BookmarkServiceDefault],
 
xref:refguide:core:index/runtimeservices/command/CommandExecutorServiceDefault.adoc[CommandExecutorServiceDefault],
 
xref:refguide:core:index/runtimeservices/command/SchemaValueMarshallerDefault.adoc[SchemaValueMarshallerDefault],
 
xref:refguide:core:index/runtimeservices/email/EmailServiceDefault.adoc[EmailServiceDefault],
 xref:refguide:core:index/runtimeservices/eventbus/EventBusServic [...]
+xref:refguide:core:index/runtimeservices/bookmarks/BookmarkServiceDefault.adoc[BookmarkServiceDefault],
 
xref:refguide:core:index/runtimeservices/command/CommandExecutorServiceDefault.adoc[CommandExecutorServiceDefault],
 
xref:refguide:core:index/runtimeservices/command/SchemaValueMarshallerDefault.adoc[SchemaValueMarshallerDefault],
 
xref:refguide:core:index/runtimeservices/email/EmailServiceDefault.adoc[EmailServiceDefault],
 xref:refguide:core:index/runtimeservices/eventbus/EventBusServic [...]
 ****
 
 |Apache Causeway Core - Security
@@ -2241,6 +2246,11 @@ Directory: /persistence/jpa/eclipselink
 ----
 |EclipseLink integration. Sets up EclipseLink as the implementation provider 
for Spring Data JPA.
 
+.Components
+****
+o.a.i.persistence.jpa.eclipselink.metamodel.EclipseLinkMetadataService +
+****
+
 .Dependencies
 ****
 jakarta.el:jakarta.el-api:jar:6.0.1 +
@@ -3080,6 +3090,7 @@ 
org.apache.causeway.persistence:causeway-persistence-jpa-eclipselink:jar:<manage
 org.apache.causeway.security:causeway-security-bypass:jar:<managed> +
 org.apache.causeway.testing:causeway-testing-fixtures-applib:jar:<managed> +
 
org.apache.causeway.testing:causeway-testing-integtestsupport-applib:jar:<managed>
 +
+org.apache.causeway.testing:causeway-testing-unittestsupport-applib:jar:<managed>
 +
 org.apache.causeway.viewer:causeway-viewer-graphql-viewer:jar:<managed> +
 org.springframework:spring-context-support:jar:<managed> +
 org.springframework.boot:spring-boot-test-autoconfigure:jar:<managed> +
@@ -5070,7 +5081,7 @@ 
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:<managed> +
 
org.apache.causeway.extensions:causeway-extensions-fullcalendar-applib:jar:<managed>
 +
 
org.apache.causeway.testing:causeway-testing-unittestsupport-applib:jar:<managed>
 +
 org.apache.causeway.viewer:causeway-viewer-wicket-ui:jar:<managed> +
-org.webjars:fullcalendar:jar:6.1.9 +
+org.webjars:fullcalendar:jar:6.1.10 +
 ****
 
 .Document Index Entries
@@ -5226,7 +5237,7 @@ Directory: /extensions/vw/pdfjs/wicket/integration
 ****
 org.apache.causeway.extensions:causeway-extensions-pdfjs-applib:jar:<managed> +
 org.apache.causeway.viewer:causeway-viewer-wicket-ui:jar:<managed> +
-org.webjars.npm:pdfjs-dist:jar:5.0.375 +
+org.webjars.npm:pdfjs-dist:jar:5.2.133 +
 ****
 
 .Document Index Entries
@@ -5314,7 +5325,7 @@ Directory: 
/retired/shiro/extensions/secman/delegated-shiro
 .Dependencies
 ****
 org.apache.causeway.core:causeway-core-runtime:jar:<managed> +
-org.apache.causeway.extensions:causeway-extensions-secman-applib:jar:3.0.0-SNAPSHOT
 +
+org.apache.causeway.extensions:causeway-extensions-secman-applib:jar:3.4.0-SNAPSHOT
 +
 org.apache.causeway.security:causeway-security-shiro:jar:<managed> +
 ****
 
@@ -6000,7 +6011,6 @@ Directory: /extensions/core/commandlog/applib
 |.Components
 ****
 o.a.i.extensions.commandlog.applib.dom.BackgroundService +
-o.a.i.extensions.commandlog.applib.dom.BackgroundService$PersistCommandExecutorService
 +
 o.a.i.extensions.commandlog.applib.dom.CommandLogEntry$TableColumnOrderDefault 
+
 o.a.i.extensions.commandlog.applib.fakescheduler.FakeScheduler +
 o.a.i.extensions.commandlog.applib.job.BackgroundCommandsJobControl +
@@ -6022,7 +6032,7 @@ org.quartz-scheduler:quartz:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:extensions:index/commandlog/applib/app/CommandLogMenu.adoc[CommandLogMenu],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasInteractionId_commandLogEntry.adoc[HasInteractionId_commandLogEntry],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasUsername_recentCommandsByUser.adoc[HasUsername_recentCommandsByUser],
 
xref:refguide:extensions:index/commandlog/applib/contributions/Object_recentCommands.adoc[Object_recentCommands],
 xref:refguide:ex [...]
+xref:refguide:extensions:index/commandlog/applib/app/CommandLogMenu.adoc[CommandLogMenu],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasInteractionId_commandLogEntry.adoc[HasInteractionId_commandLogEntry],
 
xref:refguide:extensions:index/commandlog/applib/contributions/HasUsername_recentCommandsByUser.adoc[HasUsername_recentCommandsByUser],
 
xref:refguide:extensions:index/commandlog/applib/contributions/Object_recentCommands.adoc[Object_recentCommands],
 xref:refguide:ex [...]
 ****
 
 |Apache Causeway Ext - Command Log Implementation (JDO)
@@ -7129,31 +7139,7 @@ Artifact: causeway-regressiontests-base
 Type: jar
 Directory: /regressiontests/base
 ----
-|.Components
-****
-o.a.i.testdomain.jdo.JdoInventoryDao +
-o.a.i.testdomain.jdo.JdoTestFixtures +
-o.a.i.testdomain.jpa.JpaInventoryDao +
-o.a.i.testdomain.jpa.JpaTestFixtures +
-o.a.i.testdomain.jpa.springdata.EmployeeRepository +
-o.a.i.testdomain.model.valuetypes.ValueTypeExampleService +
-o.a.i.testdomain.publishing.PublishingTestFactoryAbstract$CommitListener +
-o.a.i.testdomain.publishing.PublishingTestFactoryJdo +
-o.a.i.testdomain.publishing.PublishingTestFactoryJpa +
-o.a.i.testdomain.publishing.subscriber.CommandSubscriberForTesting +
-o.a.i.testdomain.publishing.subscriber.EntityChangesSubscriberForTesting +
-o.a.i.testdomain.publishing.subscriber.EntityPropertyChangeSubscriberForTesting
 +
-o.a.i.testdomain.publishing.subscriber.ExecutionSubscriberForTesting +
-o.a.i.testdomain.util.event.LifecycleEventSubscriberJdoForTesting +
-o.a.i.testdomain.util.event.LifecycleEventSubscriberJpaForTesting +
-o.a.i.testdomain.util.interaction.DomainObjectTesterFactory +
-o.a.i.testdomain.util.interaction.InteractionBoundaryProbe +
-o.a.i.testdomain.util.kv.KVStoreForTesting +
-o.a.i.testdomain.util.rest.RestEndpointService +
-o.a.i.testdomain.wrapperfactory.CounterRepository +
-****
-
-.Dependencies
+|.Dependencies
 ****
 
org.apache.causeway.extensions:causeway-extensions-fullcalendar-applib:jar:<managed>
 +
 
org.apache.causeway.extensions:causeway-extensions-secman-encryption-jbcrypt:jar:<managed>
 +
diff --git a/cribsheet.adoc b/cribsheet.adoc
index 36c854d5311..8accdb4d795 100644
--- a/cribsheet.adoc
+++ b/cribsheet.adoc
@@ -10,7 +10,7 @@
 ----
 sdk use java 11
 sh build-tooling.sh -- -T1C
-sh preview.sh
+./preview.sh
 ----
 
 * build all, ``git pull``ing first, excluding incubator

Reply via email to