You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/11/25 19:24:14 UTC

[5/5] isis git commit: ISIS-803: new annotation attributes allowing suclasses of the lifecycle events to be posted (or disabled altogether). also updated docs.

ISIS-803: new annotation attributes allowing suclasses of the lifecycle events to be posted (or disabled altogether).  also updated docs.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/8cf480de
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/8cf480de
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/8cf480de

Branch: refs/heads/master
Commit: 8cf480de9371c3ba55a5ca39406ce11a471f3b6e
Parents: 06bbb1e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Nov 25 18:22:37 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Nov 25 18:22:37 2015 +0000

----------------------------------------------------------------------
 .../main/asciidoc/guides/_cg_ide-templates.adoc |  58 ++-
 .../_rg_annotations_manpage-DomainObject.adoc   |  53 +-
 ...page-DomainObjectLayout_cssClassUiEvent.adoc |   7 +-
 ..._manpage-DomainObjectLayout_iconUiEvent.adoc |   6 +-
 ...manpage-DomainObjectLayout_titleUiEvent.adoc |   5 +-
 ...page-DomainObject_createdLifecycleEvent.adoc | 108 ++++
 ...npage-DomainObject_loadedLifecycleEvent.adoc | 105 ++++
 ...ge-DomainObject_persistedLifecycleEvent.adoc | 111 ++++
 ...e-DomainObject_persistingLifecycleEvent.adoc | 114 ++++
 ...age-DomainObject_removingLifecycleEvent.adoc | 114 ++++
 ...page-DomainObject_updatedLifecycleEvent.adoc | 110 ++++
 ...age-DomainObject_updatingLifecycleEvent.adoc | 114 ++++
 .../guides/_rg_runtime_configuring-core.adoc    | 134 ++++-
 .../intellij-live-templates-for-apache-isis.xml | 522 -------------------
 .../resources/templates/isis-template-idea.xml  | 522 +++++++++++++++++++
 .../isis/applib/annotation/DomainObject.java    |  91 ++++
 .../services/eventbus/ObjectCreatedEvent.java   |  30 ++
 .../services/eventbus/ObjectLoadedEvent.java    |  32 ++
 .../services/eventbus/ObjectPersistedEvent.java |  30 ++
 .../eventbus/ObjectPersistingEvent.java         |  30 ++
 .../services/eventbus/ObjectRemovingEvent.java  |  30 ++
 .../services/eventbus/ObjectUpdatedEvent.java   |  30 ++
 .../services/eventbus/ObjectUpdatingEvent.java  |  30 ++
 .../ActionDomainEventFacetAbstract.java         |   3 -
 .../callbacks/CreatedCallbackFacetAbstract.java |  35 ++
 .../callbacks/CreatedCallbackFacetFactory.java  |  62 +++
 .../CreatedCallbackFacetViaMethod.java          |  65 +++
 .../callbacks/CreatedLifecycleEventFacet.java   |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  49 ++
 .../object/callbacks/LifecycleEventFacet.java   |  28 +
 .../callbacks/LoadCallbackFacetFactory.java     |  68 +++
 .../callbacks/LoadedCallbackFacetAbstract.java  |  37 ++
 .../callbacks/LoadedCallbackFacetViaMethod.java |  65 +++
 .../callbacks/LoadedLifecycleEventFacet.java    |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  49 ++
 .../callbacks/LoadingCallbackFacetAbstract.java |  41 ++
 .../LoadingCallbackFacetViaMethod.java          |  69 +++
 .../callbacks/PersistCallbackFacetFactory.java  |  78 +++
 ...ersistCallbackViaSaveMethodFacetFactory.java |  78 +++
 .../PersistedCallbackFacetAbstract.java         |  37 ++
 .../PersistedCallbackFacetViaMethod.java        |  65 +++
 .../callbacks/PersistedLifecycleEventFacet.java |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  49 ++
 .../PersistingCallbackFacetAbstract.java        |  37 ++
 .../PersistingCallbackFacetViaMethod.java       |  65 +++
 .../PersistingLifecycleEventFacet.java          |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  50 ++
 .../callbacks/RemoveCallbackFacetFactory.java   |  78 +++
 ...moveCallbackViaDeleteMethodFacetFactory.java |  78 +++
 .../object/callbacks/RemovedCallbackFacet.java  |   2 +
 .../callbacks/RemovedCallbackFacetAbstract.java |  39 ++
 .../RemovedCallbackFacetViaMethod.java          |  69 +++
 .../RemovingCallbackFacetAbstract.java          |  37 ++
 .../RemovingCallbackFacetViaMethod.java         |  65 +++
 .../callbacks/RemovingLifecycleEventFacet.java  |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  51 ++
 .../callbacks/UpdateCallbackFacetFactory.java   |  68 +++
 .../callbacks/UpdatedCallbackFacetAbstract.java |  37 ++
 .../UpdatedCallbackFacetViaMethod.java          |  65 +++
 .../callbacks/UpdatedLifecycleEventFacet.java   |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  51 ++
 .../UpdatingCallbackFacetAbstract.java          |  37 ++
 .../UpdatingCallbackFacetViaMethod.java         |  69 +++
 .../callbacks/UpdatingLifecycleEventFacet.java  |  30 ++
 ...ycleEventFacetForDomainObjectAnnotation.java |  51 ++
 .../create/CreatedCallbackFacetAbstract.java    |  37 --
 .../create/CreatedCallbackFacetFactory.java     |  62 ---
 .../create/CreatedCallbackFacetViaMethod.java   |  65 ---
 .../load/LoadCallbackFacetFactory.java          |  68 ---
 .../load/LoadedCallbackFacetAbstract.java       |  37 --
 .../load/LoadedCallbackFacetViaMethod.java      |  65 ---
 .../load/LoadingCallbackFacetAbstract.java      |  41 --
 .../load/LoadingCallbackFacetViaMethod.java     |  69 ---
 .../persist/PersistCallbackFacetFactory.java    |  80 ---
 ...ersistCallbackViaSaveMethodFacetFactory.java |  80 ---
 .../persist/PersistedCallbackFacetAbstract.java |  37 --
 .../PersistedCallbackFacetViaMethod.java        |  65 ---
 .../PersistingCallbackFacetAbstract.java        |  37 --
 .../PersistingCallbackFacetViaMethod.java       |  65 ---
 .../remove/RemoveCallbackFacetFactory.java      |  80 ---
 ...moveCallbackViaDeleteMethodFacetFactory.java |  80 ---
 .../remove/RemovedCallbackFacetAbstract.java    |  37 --
 .../remove/RemovedCallbackFacetViaMethod.java   |  65 ---
 .../remove/RemovingCallbackFacetAbstract.java   |  37 --
 .../remove/RemovingCallbackFacetViaMethod.java  |  65 ---
 .../update/UpdateCallbackFacetFactory.java      |  68 ---
 .../update/UpdatedCallbackFacetAbstract.java    |  37 --
 .../update/UpdatedCallbackFacetViaMethod.java   |  65 ---
 .../update/UpdatingCallbackFacetAbstract.java   |  37 --
 .../update/UpdatingCallbackFacetViaMethod.java  |  69 ---
 .../DomainObjectAnnotationFacetFactory.java     | 156 ++++++
 .../RemoveSubscriberMethodsFacetFactory.java    |  70 +++
 .../dflt/ProgrammingModelFacetsJava5.java       |  14 +-
 .../CreatedCallbackFacetFactoryTest.java        |   4 +-
 .../DeleteCallbackFacetFactoryTest.java         |   6 +-
 .../callback/LoadCallbackFacetFactoryTest.java  |   6 +-
 .../PersistAndSaveCallbackFacetFactoryTest.java |   8 +-
 .../PersistCallbackFacetFactoryTest.java        |   6 +-
 ...RemoveAndDeleteCallbackFacetFactoryTest.java |   8 +-
 .../RemoveCallbackFacetFactoryTest.java         |   6 +-
 .../callback/SaveCallbackFacetFactoryTest.java  |   6 +-
 .../UpdateCallbackFacetFactoryTest.java         |   6 +-
 .../system/persistence/PersistenceSession.java  |  50 +-
 .../src/main/webapp/WEB-INF/isis.properties     |  10 +
 104 files changed, 4150 insertions(+), 2077 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_cg_ide-templates.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_cg_ide-templates.adoc b/adocs/documentation/src/main/asciidoc/guides/_cg_ide-templates.adoc
index 8cd0784..15fe40c 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_cg_ide-templates.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_cg_ide-templates.adoc
@@ -1,5 +1,5 @@
 [[_cg_ide-templates]]
-= IDE Templates
+= Code and File Templates
 :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 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.
 :_basedir: ../
 :_imagesdir: images/
@@ -7,48 +7,61 @@
 
 
 
-We provide IDE templates (for IntelliJ and Eclipse) for writing Apache Isis domain objects, and also for unit tests (JUnit and JMock).  We also provide them for IntelliJ for writing Asciidoc documentation (see also the xref:cg.adoc#_cg_asciidoc-templates[appendix]).
+We provide parameterized templates, for both IntelliJ and Eclipse, to help you write your domain applications.
+
+On IntelliJ we provide both file templates (`File > Settings > Editor > File and Code Templates`) and also live templates (`File > Settings > Editor > Live Templates`).  The former are used to create new classes or files (eg a new domain entity), while the latter are intended to modify an existing file (eg create a new property or add a `toString()` method etc).
+
+On Eclipse we provide only the latter sort of template (Windows > Preferences > Java > Editor > Templates).
+
+There are templates for writing Apache Isis domain objects, for writing unit tests (JUnit and JMock), and also for writing Asciidoc documentation (see also the xref:cg.adoc#_cg_asciidoc-templates[appendix]).
 
 
 == Download
 
 The following table lists the templates available to download:
 
-[cols="1a,1a,1a,1a,1a", options="header"]
+[cols="2a,2a,1a,2a,2a", options="header"]
 |===
 
-|Template
-|Prefix
-|IntelliJ
-|Eclipse
-
 
-|Apache Isis Domain Objects
-|is
+|Purpose
+|IntelliJ +
+file template
+|Prefix
+|IntelliJ +
+live template
+|Eclipse +
+template
+
+|Domain Objects
+|link:../resources/templates/intellij-settings-file-templates-for-apache-isis.jar[Download]
+|`is`
 |link:../resources/templates/isis-templates-idea.xml[Download]
 |link:../resources/templates/isis-templates.xml[Download]
 
-
 |JUnit tests
-|ju
+|(none)
+|`ju`
 |link:../resources/templates/junit4-templates-idea.xml[Download]
 |link:../resources/templates/junit4-templates.xml[Download]
 
 
 |JMock tests
-|jm
+|(none)
+|`jm`
 |link:../resources/templates/jmock2-templates-idea.xml[Download]
 |link:../resources/templates/jmock2-templates.xml[Download]
 
 |Asciidoc
-|ad
+|(none)
+|`ad`
 |link:../resources/templates/isis-asciidoc-templates-idea.xml[Download]
-|(none )
+|(none)
 
 |===
 
 
-The most commonly used Apache Isis domain objects templates are also listed on the link:../cheat-sheet.html[Apache Isis cheat sheet].
+The most commonly used domain objects (live) templates are also listed on the link:../cheat-sheet.html[Apache Isis cheat sheet].
 
 
 
@@ -56,15 +69,18 @@ The most commonly used Apache Isis domain objects templates are also listed on t
 
 === IntelliJ
 
-To install in IntelliJ (Community edition 15), copy to the relevant `config/templates` directory, eg:
+To install in the live templates IntelliJ (Community edition 15), copy to the relevant `config/templates` directory, eg:
 
-* Windows `<User home>\.IdeaIC14\config\templates`
+* Windows `<User home>\.IdeaIC15\config\templates`
 * Linux `~/.IdeaIC14/config/templates`
-* Mac OS `~/Library/Preferences/IdeaIC14/templates`
+* Mac OS `~/Library/Preferences/IdeaIC15/templates`
 
 If using the Ultimate edition, the directory is `.IntelliJIdea15` rather than `IdeaIC15`.
 
 
+To install the file templates, use `File > Import Settings`.
+
+
 === Eclipse
 
 To install in Eclipse, go to `Windows > Preferences > Java > Editor > Templates` and choose `Import`.
@@ -73,5 +89,7 @@ To install in Eclipse, go to `Windows > Preferences > Java > Editor > Templates`
 
 == Usage
 
-Enter the prefix (`is`, `ju`, `jm`) and the IDE will list all available templates in that category.  
+For the live templates, enter the prefix in the editor (`is`, `ju`, `jm`) and the IDE will list all available templates
+in that category.
 
+For the file templates (IntelliJ only), these are available from `File > New`.

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject.adoc
index 49ffa46..93bcae2 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject.adoc
@@ -41,6 +41,12 @@ The table below summarizes the annotation's attributes.
 (`false`)
 |Whether the number of instances of this domain class is relatively small (a "bounded" set), such that instances could be selected from a drop-down list box or similar.
 
+|xref:rg.adoc#_rg_annotations_manpage-DomainObject_createdLifecycleEvent[`created-` +
+`LifecycleEvent()`] +
+(`1.11.0-SNAPSHOT`)
+|subtype of `ObjectCreatedEvent` +
+(`ObjectCreatedEvent.Default`)
+|the event type to be posted to the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] whenever an instance is created
 
 |xref:rg.adoc#_rg_annotations_manpage-DomainObject_editing[`editing()`]
 |`AS_CONFIGURED`, `ENABLED`, `DISABLED` +
@@ -58,6 +64,20 @@ The table below summarizes the annotation's attributes.
 |specify an alias for the domain class used to uniquely identify the object both within the Apache Isis runtime and externally
 
 
+|xref:rg.adoc#_rg_annotations_manpage-DomainObject_persistedLifecycleEvent[`persisted-` +
+`LifecycleEvent()`] +
+(`1.11.0-SNAPSHOT`)
+|subtype of `ObjectPersistedEvent` +
+(`ObjectPersistedEvent.Default`)
+|the event type to be posted (`1.11.0-SNAPSHOT`) to the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] whenever an instance has just been persisted
+
+|xref:rg.adoc#_rg_annotations_manpage-DomainObject_persistingLifecycleEvent[`persisting-` +
+`LifecycleEvent()`] +
+(`1.11.0-SNAPSHOT`)
+|subtype of `ObjectPersistingEvent` +
+(`ObjectPersistingEvent.Default`)
+|the event type to be posted (`1.11.0-SNAPSHOT`) to the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] whenever an instance is about to be persisted
+
 |xref:rg.adoc#_rg_annotations_manpage-DomainObject_publishing[`publishing()`]
 |`AS_CONFIGURED`, `ENABLED`, `DISABLED` +
 (`AS_CONFIGURED`)
@@ -69,6 +89,27 @@ The table below summarizes the annotation's attributes.
 |subtype of `PublishingPayloadFactory-` `ForObject` (none)
 |specifies that a custom implementation of `PublishingPayloadFactoryForObject` be used to create the (payload of the) published event representing the change to the object
 
+|xref:rg.adoc#_rg_annotations_manpage-DomainObject_removingLifecycleEvent[`removing-` +
+`LifecycleEvent()`] +
+(`1.11.0-SNAPSHOT`)
+|subtype of `ObjectRemovingEvent` +
+(`ObjectRemovingEvent.Default`)
+|the event type to be posted (`1.11.0-SNAPSHOT`) to the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] whenever an instance is about to be deleted
+
+|xref:rg.adoc#_rg_annotations_manpage-DomainObject_updatedLifecycleEvent[`updated-` +
+`LifecycleEvent()`] +
+(`1.11.0-SNAPSHOT`)
+|subtype of `ObjectUpdatedEvent` +
+(`ObjectUpdatedEvent.Default`)
+|the event type to be posted (`1.11.0-SNAPSHOT`) to the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] whenever an instance has just been updated
+
+|xref:rg.adoc#_rg_annotations_manpage-DomainObject_updatingLifecycleEvent[`updating-` +
+`LifecycleEvent()`] +
+(`1.11.0-SNAPSHOT`)
+|subtype of `ObjectUpdatingEvent` +
+(`ObjectUpdatingEvent.Default`)
+|the event type to be posted (`1.11.0-SNAPSHOT`) to the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] whenever an instance is about to be updated
+
 |===
 
 
@@ -80,8 +121,9 @@ For example:
 @DomainObject(
     auditing=Auditing.ENABLED,
     autoCompleteRepository=CustomerRepository.class
-    editing=Editing.ENABLED,               // <1>
-    publishing=Publishing.ENABLED
+    editing=Editing.ENABLED,                            // <1>
+    updatedLifecycleEvent=Customer.UpdatedEvent.class
+
 )
 public class Customer {
     ...
@@ -94,10 +136,17 @@ public class Customer {
 include::_rg_annotations_manpage-DomainObject_auditing.adoc[leveloffset=+1]
 include::_rg_annotations_manpage-DomainObject_autoCompleteRepository.adoc[leveloffset=+1]
 include::_rg_annotations_manpage-DomainObject_bounded.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_createdLifecycleEvent.adoc[leveloffset=+1]
 include::_rg_annotations_manpage-DomainObject_editing.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_loadedLifecycleEvent.adoc[leveloffset=+1]
 include::_rg_annotations_manpage-DomainObject_nature.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_persistedLifecycleEvent.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_persistingLifecycleEvent.adoc[leveloffset=+1]
 include::_rg_annotations_manpage-DomainObject_objectType.adoc[leveloffset=+1]
 include::_rg_annotations_manpage-DomainObject_publishing.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_removingLifecycleEvent.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_updatingLifecycleEvent.adoc[leveloffset=+1]
+include::_rg_annotations_manpage-DomainObject_updatedLifecycleEvent.adoc[leveloffset=+1]
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent.adoc
index c79e7a3..2b6a4b2 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent.adoc
@@ -10,8 +10,9 @@ in any wrapping ``<div>``s and ``<span>``s that render the domain object.  This
 xref:rg.adoc#_rg_methods_reserved_manpage-cssClass[`cssClass()`] reserved method.  (If `cssClass()` is present, then
 it will take precedence).
 
-Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] using either link:https://github.com/google/guava[Guava] or link:http://www.axonframework.org/[Axon Framework] annotations and can
-optionally specify a title.
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use obtain a reference to the domain object from the event.  From this they can, if they wish, specify a CSS class for
+the domain object using the event's API.
 
 [NOTE]
 ====
@@ -108,7 +109,7 @@ The framework provides `CssClassUiEvent.Doop` as such a subclass, so setting the
 will ensure that the event to be posted, irrespective of the configuration property setting.
 
 And, conversely, the framework also provides `CssClassUiEvent.Noop`; if `cssClassUiEvent` attribute is set to this class,
-thn no event will be posted.
+then no event will be posted.
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_iconUiEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_iconUiEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_iconUiEvent.adoc
index 600d3da..d88f38b 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_iconUiEvent.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_iconUiEvent.adoc
@@ -10,8 +10,10 @@ object (if possible). This is as an alternative to implementing
 xref:rg.adoc#_rg_methods_reserved_manpage-iconName[`iconName()`] reserved method.  (If `iconName()` is present, then
 it will take precedence).
 
-Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] using either link:https://github.com/google/guava[Guava] or link:http://www.axonframework.org/[Axon Framework] annotations and can
-optionally specify a title.
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use obtain a reference to the domain object from the event.  From this they can, if they wish, specify an icon name for
+the domain object using the event's API.
+
 
 [NOTE]
 ====

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_titleUiEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_titleUiEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_titleUiEvent.adoc
index 6404f3e..899ef9d 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_titleUiEvent.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObjectLayout_titleUiEvent.adoc
@@ -10,8 +10,9 @@ This is as an alternative to implementing xref:rg.adoc#_rg_methods_reserved_manp
 using the xref:rg.adoc#_rg_annotations_manpage-Title[`@Title`] annotation, within the class itself.  (If either
 `title()` or `@Title` are present, then they will take precedence).
 
-Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] using either link:https://github.com/google/guava[Guava] or link:http://www.axonframework.org/[Axon Framework] annotations and can
-optionally specify a title.
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use obtain a reference to the domain object from the event.  From this they can, if they wish, specify a title for
+the domain object using the event's API.
 
 [NOTE]
 ====

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_createdLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_createdLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_createdLifecycleEvent.adoc
new file mode 100644
index 0000000..88fe74d
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_createdLifecycleEvent.adoc
@@ -0,0 +1,108 @@
+[[_rg_annotations_manpage-DomainObject_createdLifecycleEvent]]
+= createdLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a domain object is instantiated or otherwise becomes known to the framework, a "created" lifecycle event is fired.  This is typically when the xref:rg.adoc#_rg_services-api_manpage-DomainObjectContainer[`DomainObjectContainer`]'s xref:rg.adoc#_rg_services-api_manpage-DomainObjectContainer_object-creation-api[`newTransientInstance()`] is called;
+it will also happen if the object is simply instantiated with `new(...)`, and then the container's
+xref:rg.adoc#_rg_services-api_manpage-DomainObjectContainer_services-api[`injectServicesInto(...)`] method is called.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the object just created.  The subscriber could then, for example, update the
+object, eg looking up state from some external datastore.
+
+
+By default the event raised is `ObjectCreatedEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `createdLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    createdLifecycleEvent=ToDoItem.CreatedEvent.class
+)
+public class ToDoItem {
+    public static class CreatedEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectCreatedEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectCreatedEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectCreatedEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `createdLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectCreatedEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.createdLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `createdLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectCreatedEvent.Doop` as such a subclass, so setting the `createdLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectCreatedEvent.Noop`; if `createdLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_loadedLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_loadedLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_loadedLifecycleEvent.adoc
new file mode 100644
index 0000000..e861800
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_loadedLifecycleEvent.adoc
@@ -0,0 +1,105 @@
+[[_rg_annotations_manpage-DomainObject_loadedLifecycleEvent]]
+= loadedLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a persistent domain object is loaded from the database, a "loaded" lifecycle event is fired.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the domain object just loaded.  The subscriber could then, for example, update
+or default values on the object (eg to support on-the-fly migration scenarios).
+
+By default the event raised is `ObjectLoadedEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `loadedLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    loadedLifecycleEvent=ToDoItem.LoadedEvent.class
+)
+public class ToDoItem {
+    public static class LoadedEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectLoadedEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectLoadedEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectLoadedEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `loadedLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectLoadedEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.loadedLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `loadedLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectLoadedEvent.Doop` as such a subclass, so setting the `loadedLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectLoadedEvent.Noop`; if `loadedLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistedLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistedLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistedLifecycleEvent.adoc
new file mode 100644
index 0000000..5330ca3
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistedLifecycleEvent.adoc
@@ -0,0 +1,111 @@
+[[_rg_annotations_manpage-DomainObject_persistedLifecycleEvent]]
+= persistedLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a (just created, still transient) domain object has been saved (INSERTed in)to the database, a "persisted" lifecycle
+event is fired.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, maintain an
+external datastore.
+
+[WARNING]
+====
+The object should _not_ be modified during the persisted callback.
+====
+
+By default the event raised is `ObjectPersistedEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `persistedLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    persistedLifecycleEvent=ToDoItem.PersistedEvent.class
+)
+public class ToDoItem {
+    public static class PersistedEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectPersistedEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectPersistedEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectPersistedEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `persistedLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectPersistedEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.persistedLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `persistedLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectPersistedEvent.Doop` as such a subclass, so setting the `persistedLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectPersistedEvent.Noop`; if `persistedLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistingLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistingLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistingLifecycleEvent.adoc
new file mode 100644
index 0000000..56c523c
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_persistingLifecycleEvent.adoc
@@ -0,0 +1,114 @@
+[[_rg_annotations_manpage-DomainObject_persistingLifecycleEvent]]
+= persistingLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a (just created, still transient) domain object is about to be saved (INSERTed in)to the database, a "persisting" lifecycle
+event is fired.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, update the object,
+or it could use it maintain an external datastore.  One possible application is to maintain a full-text search database using
+link:https://lucene.apache.org/[Apache Lucene] or similar.
+
+[NOTE]
+====
+Another use case is to maintain "last updated by"/"last updated at" properties.  While you can roll your own, note that
+the framework provides built-in support for this use case through the
+xref:rg.adoc#_rg_classes_roles_manpage-Timestampable[`Timestampable`] role interface.
+====
+
+By default the event raised is `ObjectPersistingEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `persistingLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    persistingLifecycleEvent=ToDoItem.PersistingEvent.class
+)
+public class ToDoItem {
+    public static class PersistingEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectPersistingEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectPersistingEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectPersistingEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `persistingLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectPersistingEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.persistingLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `persistingLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectPersistingEvent.Doop` as such a subclass, so setting the `persistingLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectPersistingEvent.Noop`; if `persistingLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_removingLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_removingLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_removingLifecycleEvent.adoc
new file mode 100644
index 0000000..7fefe56
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_removingLifecycleEvent.adoc
@@ -0,0 +1,114 @@
+[[_rg_annotations_manpage-DomainObject_removingLifecycleEvent]]
+= removingLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a (persistent) domain object is about to be removed (DELETEd) from the database, a "removing"
+lifecycle event is fired.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, could use it
+maintain an external datastore.  One possible application is to maintain a full-text search database
+using link:https://lucene.apache.org/[Apache Lucene] or similar.
+
+[NOTE]
+====
+Another use case is to maintain "last updated by"/"last updated at" properties.  While you can roll your own, note that
+the framework provides built-in support for this use case through the
+xref:rg.adoc#_rg_classes_roles_manpage-Timestampable[`Timestampable`] role interface.
+====
+
+By default the event raised is `ObjectRemovingEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `removingLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    removingLifecycleEvent=ToDoItem.RemovingEvent.class
+)
+public class ToDoItem {
+    public static class RemovingEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectRemovingEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectRemovingEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectRemovingEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `removingLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectRemovingEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `removingLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectRemovingEvent.Doop` as such a subclass, so setting the `removingLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectRemovingEvent.Noop`; if `removingLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatedLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatedLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatedLifecycleEvent.adoc
new file mode 100644
index 0000000..f480dd3
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatedLifecycleEvent.adoc
@@ -0,0 +1,110 @@
+[[_rg_annotations_manpage-DomainObject_updatedLifecycleEvent]]
+= updatedLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a (persistent) domain object has been modified and has been updated in the database, an "updated" lifecycle
+event is fired.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the domain object.
+
+[WARNING]
+====
+The object should _not_ be modified during the updated callback.
+====
+
+By default the event raised is `ObjectUpdatedEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `updatedLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    updatedLifecycleEvent=ToDoItem.UpdatedEvent.class
+)
+public class ToDoItem {
+    public static class UpdatedEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectUpdatedEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectUpdatedEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectUpdatedEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `updatedLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectUpdatedEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.updatedLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `updatedLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectUpdatedEvent.Doop` as such a subclass, so setting the `updatedLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectUpdatedEvent.Noop`; if `updatedLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatingLifecycleEvent.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatingLifecycleEvent.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatingLifecycleEvent.adoc
new file mode 100644
index 0000000..6a783f1
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_annotations_manpage-DomainObject_updatingLifecycleEvent.adoc
@@ -0,0 +1,114 @@
+[[_rg_annotations_manpage-DomainObject_updatingLifecycleEvent]]
+= updatingLifecycleEvent() (`1.11.0-SNAPSHOT`)
+: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 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Whenever a (persistent) domain object has been modified and is about to be updated to the database, an "updating"
+lifecycle event is fired.
+
+Subscribers subscribe through the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] and can
+use the event to obtain a reference to the domain object.  The subscriber could then, for example, update the object,
+or it could use it maintain an external datastore.  One possible application is to maintain a full-text search database
+using link:https://lucene.apache.org/[Apache Lucene] or similar.
+
+[NOTE]
+====
+Another use case is to maintain "last updated by"/"last updated at" properties.  While you can roll your own, note that
+the framework provides built-in support for this use case through the
+xref:rg.adoc#_rg_classes_roles_manpage-Timestampable[`Timestampable`] role interface.
+====
+
+By default the event raised is `ObjectUpdatingEvent.Default`. For example:
+
+[source,java]
+----
+@DomainObject
+public class ToDoItemDto {
+    ...
+}
+----
+
+The purpose of the `updatingLifecycleEvent()` attribute is to allows a custom subclass to be emitted instead.  A similar
+attribute is available for other lifecycle events.
+
+For example:
+
+[source,java]
+----
+@DomainObjectLayout(
+    updatingLifecycleEvent=ToDoItem.UpdatingEvent.class
+)
+public class ToDoItem {
+    public static class UpdatingEvent
+        extends org.apache.isis.applib.services.eventbus.ObjectUpdatingEvent<ToDoItem> { }
+    ...
+}
+----
+
+The benefit is that subscribers can be more targeted as to the events that they subscribe to.
+
+
+
+
+== Subscribers
+
+Subscribers (which must be domain services) subscribe using either the link:https://github.com/google/guava[Guava] API
+or (if the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] has been appropriately configured)
+using the link:http://www.axonframework.org/[Axon Framework] API.  The examples below use the Guava API.
+
+Subscribers can be either coarse-grained (if they subscribe to the top-level event type):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ObjectUpdatingEvent ev) {
+        if(ev.getSource() instanceof ToDoItem) { ... }
+    }
+}
+----
+
+or can be fine-grained (by subscribing to specific event subtypes):
+
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class SomeSubscriber extends AbstractSubscriber {
+    @com.google.common.eventbus.Subscribe
+    public void on(ToDoItem.ObjectUpdatingEvent ev) {
+        ...
+    }
+}
+----
+
+
+[TIP]
+====
+If the AxonFramework is being used, replace `@com.google.common.eventbus.Subscribe` with `@org.axonframework.eventhandling.annotation.EventHandler`.
+====
+
+
+
+
+
+== Default, Doop and Noop events
+
+If the `updatingLifecycleEvent` attribute is not explicitly specified (is left as its default value, `ObjectUpdatingEvent.Default`),
+then the framework will, by default, post an event.
+
+If this is not required, then the `isis.reflector.facet.domainObjectAnnotation.updatingLifecycleEvent.postForDefault`
+configuration property can be set to "false"; this will disable posting.
+
+On the other hand, if the `updatingLifecycleEvent` has been explicitly specified to some subclass, then an event will be posted.
+The framework provides `ObjectUpdatingEvent.Doop` as such a subclass, so setting the `updatingLifecycleEvent` attribute to this class
+will ensure that the event to be posted, irrespective of the configuration property setting.
+
+And, conversely, the framework also provides `ObjectUpdatingEvent.Noop`; if `updatingLifecycleEvent` attribute is set to this class,
+then no event will be posted.
+
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/8cf480de/adocs/documentation/src/main/asciidoc/guides/_rg_runtime_configuring-core.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_runtime_configuring-core.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_runtime_configuring-core.adoc
index 28d83ee..00505f6 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_runtime_configuring-core.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_runtime_configuring-core.adoc
@@ -23,13 +23,15 @@ Configuration properties for the JDO/DataNucleus objectstore can be found in the
 
 |`isis.object.` +
 `editing`
-| `true`,`false` (`true`)
+|`true`,`false` +
+(`true`)
 |Whether objects' properties and collections can be edited directly (for objects annotated with xref:rg.adoc#_rg_annotations_manpage-DomainObject_editing[`@DomainObject#editing()`]); see xref:rg.adoc#_rg_runtime_configuring-core_isis-objects-editing[below] for further discussion.
 
 
 |`isis.persistor.` +
 `disableConcurrencyChecking`
-| `true`,`false` (`false`)
+|`true`,`false` +
+(`false`)
 | Disables concurrency checking globally.  +
 
 Only intended for "emergency use" as a workaround while pending fix/patch to Apache Isis itself.  (Note that there is no "datanucleus" in the property).
@@ -37,18 +39,20 @@ Only intended for "emergency use" as a workaround while pending fix/patch to Apa
 |`isis.reflector.facet.` +
 `actionAnnotation.` +
 `domainEvent.postForDefault`
-|`true`,`false` (`true`)
+|`true`,`false` +
+(`true`)
 |Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-Action_domainEvent[`@Action#domainEvent()`] is not specified (is set to `ActionDomainEvent.Default`).
 
 |`isis.reflector.facet.` +
 `collectionAnnotation.` +
 `domainEvent.postForDefault`
-|`true`,`false` (`true`)
+|`true`,`false` +
+(`true`)
 |Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-Collection_domainEvent[`@Collection#domainEvent()`] is not specified (is set to `CollectionDomainEvent.Default`).
 
 |`isis.reflector.facet.` +
 `cssClass.patterns`
-|regex:css1,regex2:css2,...
+|regex:css1, regex2:css2,...
 |Comma separated list of key:value pairs, where the key is a regex matching action names (eg `delete.*`) and the value is a link:http://getbootstrap.com/css/[Bootstrap] CSS button class (eg `btn-warning) to be applied (as per `@CssClass()`) to all action members matching the regex. +
 
 See xref:ug.adoc#_ug_how-tos_ui-hints_action-icons-and-css[UI hints] for more details.
@@ -61,26 +65,96 @@ See xref:ug.adoc#_ug_how-tos_ui-hints_action-icons-and-css[UI hints] for more de
 See xref:ug.adoc#_ug_how-tos_ui-hints_action-icons-and-css[UI hints] for more details.
 
 |`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`createdLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_createdLifecycleEvent[`@DomainObject#createdLifecycleEvent()`] is not specified (is set to `ObjectCreatedEvent.Default`).
+
+|`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`loadedLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_loadedLifecycleEvent[`@DomainObject#loadedLifecycleEvent()`] is not specified (is set to `ObjectLoadedEvent.Default`).
+
+|`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`persistingLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_persistingLifecycleEvent[`@DomainObject#persistingLifecycleEvent()`] is not specified (is set to `ObjectPersistingEvent.Default`).
+
+|`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`persistedLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_persistedLifecycleEvent[`@DomainObject#persistedLifecycleEvent()`] is not specified (is set to `ObjectPersistedEvent.Default`).
+
+|`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`removingLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_removingLifecycleEvent[`@DomainObject#removingLifecycleEvent()`] is not specified (is set to `ObjectRemovingEvent.Default`).
+
+|`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`updatingLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_updatingLifecycleEvent[`@DomainObject#updatingLifecycleEvent()`] is not specified (is set to `ObjectUpdatingEvent.Default`).
+
+|`isis.reflector.facet.` +
+`domainObjectAnnotation.` +
+`updatedLifecycleEvent.` +
+`postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
+|Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObject_updatedLifecycleEvent[`@DomainObject#updatedLifecycleEvent()`] is not specified (is set to `ObjectUpdatedEvent.Default`).
+
+|`isis.reflector.facet.` +
 `domainObjectLayoutAnnotation.` +
-`cssClassUiEvent.postForDefault`
-|`true`,`false` (`true`)
+`cssClassUiEvent.postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
 |Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObjectLayout_cssClassUiEvent[`@DomainObjectLayout#cssClassUiEvent()`] is not specified (is set to `CssClassUiEvent.Default`).
 
 |`isis.reflector.facet.` +
 `domainObjectLayoutAnnotation.` +
-`iconUiEvent.postForDefault`
-|`true`,`false` (`true`)
+`iconUiEvent.postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
 |Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObjectLayout_iconUiEvent[`@DomainObjectLayout#iconUiEvent()`] is not specified (is set to `IconUiEvent.Default`).
 
 |`isis.reflector.facet.` +
 `domainObjectLayoutAnnotation.` +
-`titleUiEvent.postForDefault`
-|`true`,`false` (`true`)
+`titleUiEvent.postForDefault` +
+(`1.11.0-SNAPSHOT`)
+|`true`,`false` +
+(`true`)
 |Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-DomainObjectLayout_titleUiEvent[`@DomainObjectLayout#titleUiEvent()`] is not specified (is set to `TitleUiEvent.Default`).
 
 |`isis.reflector.facet.` +
 `filterVisibility`
-| `true`,`false` (`true`)
+|`true`,`false` +
+(`true`)
 |Whether objects should be filtered for visibility. +
 
 See xref:rg.adoc#_rg_runtime_configuring-core_filterVisibility[section below] for further discussion.
@@ -88,7 +162,8 @@ See xref:rg.adoc#_rg_runtime_configuring-core_filterVisibility[section below] fo
 |`isis.reflector.facet.` +
 `propertyAnnotation.` +
 `domainEvent.postForDefault`
-|`true`,`false` (`true`)
+|`true`,`false` +
+(`true`)
 |Whether an event should be posted if xref:rg.adoc#_rg_annotations_manpage-Property_domainEvent[`@Property#domainEvent()`] is not specified (is set to `PropertyDomainEvent.Default`).
 
 |`isis.reflector.facets`
@@ -128,7 +203,8 @@ See xref:ug.adoc#_ug_extending_programming-model_custom-validator[Custom Validat
 
 |`isis.reflector.validator.` +
 `allowDeprecated`
-| `true`,`false` (`true`)
+|`true`,`false` +
+(`true`)
 | Whether deprecated annotations or naming conventions are tolerated or not.  If not, then a metamodel validation error will be triggered, meaning the app won't boot (fail-fast).
 
 
@@ -143,7 +219,8 @@ This property is IGNORED if the xref:rg.adoc#_rg_runtime_configuring-components[
 
 |`isis.services.` +
 `audit.objects`
-| `all`, `none` (`all`)
+| `all`, `none` +
+(`all`)
 |Whether the changed properties of objects should be automatically audited (for objects annotated with xref:rg.adoc#_rg_annotations_manpage-DomainObject_auditing[`@DomainObject(auditing=Auditing.AS_CONFIGURED)`].
 
 |`isis.services.` +
@@ -156,12 +233,14 @@ This property is IGNORED if the xref:rg.adoc#_rg_runtime_configuring-components[
 
 |`isis.services.` +
 `container.disableAutoFlush`
-| `true`,`false` (`_false_`)
+|`true`,`false` +
+(`false`)
 |Whether the `DomainObjectContainer` should automatically flush pending changes prior to querying (via `allMatches()`, `firstMatch()` and so on).
 
 |`isis.services.` +
 `container.disableAutoFlush`
-| `true`,`false` (`_false_`)
+|`true`,`false` +
+(`false`)
 |Whether the `DomainObjectContainer` should automatically flush pending changes prior to querying (via `allMatches()`, `firstMatch()` and so on).
 
 
@@ -170,7 +249,8 @@ This property is IGNORED if the xref:rg.adoc#_rg_runtime_configuring-components[
 `ContentNegotiation-` +
 `ServiceXRoDomainType` +
 .prettyPrint
-| `true`,`false` (depends)
+| `true`,`false` +
+(depends)
 |If a domain object has been mapped to the specified JAXB `x-ro-domain-type`, then determines whether the result is pretty-printed or not. +
 +
 If no configuration property is available, then the defaults is determined by the xref:rg.adoc#_rg_runtime_deployment-types[deployment type]: production mode disables pretty printing, while prototype mode enables it.
@@ -179,7 +259,8 @@ If no configuration property is available, then the defaults is determined by th
 
 | `isis.service.` +
 `email.tls.enabled`
-| `true`,`false` (`_true_`)
+|`true`,`false` +
+(`true`)
 |Whether to enable TLS for the email SMTP connection (used by xref:rg.adoc#_rg_services-api_manpage-EmailService[`EmailService`]).  +
 
 NB: note that the key is mis-spelt, (`isis.service.email` rather than `isis.services.email`)
@@ -216,12 +297,14 @@ NB: note that the key is mis-spelt, (`isis.service.email` rather than `isis.serv
 
 | `isis.services.` +
 `eventbus.implementation` +
-| `guava`, `axon`, FQCN (`_guava_`)
+| `guava`, `axon`, +
+FQCN (`_guava_`)
 |which implementation to use by the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] as the underlying event bus.
 
 | `isis.services.` +
 `eventbus.allowLateRegistration` +
-| `true`, `false`, (`_false_`)
+|`true`,`false` +
+(`false`)
 |whether a domain service can register with the xref:rg.adoc#_rg_services-api_manpage-EventBusService[`EventBusService`] after any events have posted. +
 
 Since this almost certainly constitutes a bug in application code, by default this is disallowed.
@@ -229,7 +312,8 @@ Since this almost certainly constitutes a bug in application code, by default th
 
 | `isis.services.` +
 `exceprecog.logRecognizedExceptions` +
-| `true`, `false`, (`_false_`)
+|`true`,`false` +
+(`false`)
 |whether recognized exceptions should also be logged. +
 
 Generally a recognized exception is one that is expected (for example a uniqueness constraint violated in the database) and which does not represent an error condition.  This property logs the exception anyway, useful for debugging.
@@ -238,7 +322,8 @@ Generally a recognized exception is one that is expected (for example a uniquene
 | `isis.services.` +
 `ExceptionRecognizerComposite-` +
 `ForJdoObjectStore.disable` +
-| `true`, `false`, (`_false_`)
+|`true`,`false` +
+(`false`)
 |whether to disable the default recognizers registered by `ExceptionRecognizerCompositeForJdoObjectStore`. +
 
 This implementation provides a default set of recognizers to convert RDBMS constraints into user-friendly messages.  In the (probably remote) chance that this functionality isn't required, they can be disabled through this flag.
@@ -246,7 +331,8 @@ This implementation provides a default set of recognizers to convert RDBMS const
 
 |`isis.services.` +
 `publish.objects`
-| `all`, `none` (`all`)
+| `all`, `none` +
+(`all`)
 |Whether changed objects should be automatically published (for objects annotated with xref:rg.adoc#_rg_annotations_manpage-DomainObject_publishing[`@DomainObject(publishing=Publishing.AS_CONFIGURED)`].
 
 |`isis.services.` +