You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2023/03/28 22:25:11 UTC

[causeway] 02/02: adds @DomainObject#introspection

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

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

commit 1293c1668dbe544bfcd1b3747b540f85c53d3e34
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Mar 28 23:23:42 2023 +0100

    adds @DomainObject#introspection
---
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |  7 +++
 .../demoapp/dom/_infra/values/ValueHolder.java     |  3 ++
 .../objects/DomainObject/DomainObjectMenu.java     |  2 +-
 .../aliased/DomainObjectAliasedVm.layout.xml       |  7 +--
 .../aliased/jpa/DomainObjectAliasedJpa.java        |  7 ++-
 .../DomainObjectAutoCompleteVm.layout.xml          |  7 +--
 .../jpa/DomainObjectAutoCompleteJpa.java           |  7 ++-
 .../bounded/jpa/DomainObjectBoundingJpa.java       |  7 ++-
 .../editing/DomainObjectEditingVm.layout.xml       |  7 +--
 .../editing/jpa/DomainObjectEditingJpa.java        | 11 ++--
 ...inObjectEntityChangePublishingEntity.layout.xml | 51 +++++++++++++------
 ...DomainObjectEntityChangePublishingVm.layout.xml |  7 +--
 .../jdo/DomainObjectEntityChangePublishingJdo.java |  7 +--
 .../jpa/DomainObjectEntityChangePublishingJpa.java | 15 +++---
 .../introspection/DomainObjectIntrospection.java}  | 14 ++++--
 .../introspection/DomainObjectIntrospectionVm.java |  4 +-
 .../DomainObjectIntrospectionVm.layout.xml         | 25 ++++++----
 ...inObjectIntrospectionVm_annotationOptional.java | 49 ++++++++++++++++++
 ...nObjectIntrospectionVm_annotationRequired.java} | 49 +++++++++---------
 .../DomainObjectIntrospectionAnnotOpt.java         | 14 +-----
 .../DomainObjectIntrospectionAnnotOpt.layout.xml}  | 24 ++++-----
 ...ObjectIntrospectionAnnotOptJpa-description.adoc |  8 ++-
 .../jpa/DomainObjectIntrospectionAnnotOptJpa.java  | 47 ++++++++----------
 .../DomainObjectIntrospectionAnnotReqd.java        | 15 +-----
 .../DomainObjectIntrospectionAnnotReqd.layout.xml} | 24 ++++-----
 ...bjectIntrospectionAnnotReqdJpa-description.adoc |  8 ++-
 .../jpa/DomainObjectIntrospectionAnnotReqdJpa.java | 52 +++++++++----------
 .../DomainObjectIntrospectionEncapsulated.java     | 23 ++-------
 ...mainObjectIntrospectionEncapsulated.layout.xml} | 24 ++++-----
 ...ctIntrospectionEncapsulatedJpa-description.adoc |  7 ++-
 .../DomainObjectIntrospectionEncapsulatedJpa.java  | 58 ++++++++++++----------
 ...ObjectIntrospectionVm_encapsulationEnabled.java | 52 +++++++++++++++++++
 32 files changed, 385 insertions(+), 257 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
index 11bd677eef..899a0f93a7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
@@ -25,6 +25,10 @@ import demoapp.dom.domain.objects.DomainObject.autoComplete.jpa.DomainObjectAuto
 import demoapp.dom.domain.objects.DomainObject.bounded.jpa.DomainObjectBoundingJpa;
 import demoapp.dom.domain.objects.DomainObject.editing.jpa.DomainObjectEditingJpa;
 import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.jpa.DomainObjectEntityChangePublishingJpa;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotOpt.jpa.DomainObjectIntrospectionAnnotOptJpa;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.jpa.DomainObjectIntrospectionAnnotReqdJpa;
+import demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.DomainObjectIntrospectionEncapsulated;
+import demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.jpa.DomainObjectIntrospectionEncapsulatedJpa;
 import demoapp.dom.domain.objects.DomainObject.nature.viewmodels.jaxbrefentity.jpa.JaxbRefJpa;
 import demoapp.dom.domain.objects.other.embedded.jpa.NumberConstantJpa;
 import demoapp.dom.domain.properties.Property.commandPublishing.jpa.PropertyCommandPublishingJpa;
@@ -96,6 +100,9 @@ import org.springframework.context.annotation.Profile;
         DomainObjectBoundingJpa.class,
         DomainObjectEditingJpa.class,
         DomainObjectEntityChangePublishingJpa.class,
+        DomainObjectIntrospectionAnnotOptJpa.class,
+        DomainObjectIntrospectionAnnotReqdJpa.class,
+        DomainObjectIntrospectionEncapsulatedJpa.class,
 
         CausewayBlobJpa.class,
         CausewayClobJpa.class,
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
index dfc653ed06..f9ee34d213 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
@@ -20,9 +20,12 @@ package demoapp.dom._infra.values;
 
 import javax.inject.Named;
 
+import org.apache.causeway.applib.annotation.Programmatic;
+
 @Named("demo.ValueHolder")
 public interface ValueHolder<T> {
 
+    @Programmatic
     T value();
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
index 5e407d45f2..a93f2e5372 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/DomainObjectMenu.java
@@ -82,7 +82,7 @@ public class DomainObjectMenu {
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-book", describedAs = "Control over introspection process")
+    @ActionLayout(cssClassFa="fa-triangle-person-digging", describedAs = "Control over introspection process")
     public DomainObjectIntrospectionVm introspection(){
         return new DomainObjectIntrospectionVm();
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/DomainObjectAliasedVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/DomainObjectAliasedVm.layout.xml
index e09c011efa..cec46c3a2d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/DomainObjectAliasedVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/DomainObjectAliasedVm.layout.xml
@@ -34,14 +34,15 @@
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
 				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/jpa/DomainObjectAliasedJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/jpa/DomainObjectAliasedJpa.java
index a91cd1b835..39d4a23d9d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/jpa/DomainObjectAliasedJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/aliased/jpa/DomainObjectAliasedJpa.java
@@ -27,11 +27,11 @@ import javax.inject.Named;
 import javax.persistence.*;
 
 import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
@@ -39,10 +39,13 @@ import org.springframework.context.annotation.Profile;
 )
 @EntityListeners(CausewayEntityListener.class)
 @Named("demo.party.Customer")                   // <.>
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
+        nature = Nature.ENTITY,
         aliased = {"demo.customer.Customer"}    // <.>
 )
-@NoArgsConstructor
 public class DomainObjectAliasedJpa extends DomainObjectAliased {
     // ...
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/DomainObjectAutoCompleteVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/DomainObjectAutoCompleteVm.layout.xml
index 319686dee1..d10fab04a4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/DomainObjectAutoCompleteVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/DomainObjectAutoCompleteVm.layout.xml
@@ -34,14 +34,15 @@
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
 				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/jpa/DomainObjectAutoCompleteJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/jpa/DomainObjectAutoCompleteJpa.java
index 44520dbae9..13e12b571e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/jpa/DomainObjectAutoCompleteJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/autoComplete/jpa/DomainObjectAutoCompleteJpa.java
@@ -28,11 +28,11 @@ import javax.inject.Named;
 import javax.persistence.*;
 
 import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
@@ -40,11 +40,14 @@ import org.springframework.context.annotation.Profile;
 )
 @EntityListeners(CausewayEntityListener.class)
 @Named("demo.DomainObjectAutoComplete")
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
+        nature = Nature.ENTITY,
         autoCompleteRepository = DomainObjectAutoCompleteRepository.class,  // <.>
         autoCompleteMethod = "findMatching"                 // <.>
 )
-@NoArgsConstructor
 public class DomainObjectAutoCompleteJpa extends DomainObjectAutoComplete {
     // ...
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/bounded/jpa/DomainObjectBoundingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/bounded/jpa/DomainObjectBoundingJpa.java
index b3d37d0bff..bdfd15eda2 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/bounded/jpa/DomainObjectBoundingJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/bounded/jpa/DomainObjectBoundingJpa.java
@@ -28,11 +28,11 @@ import javax.persistence.*;
 
 import org.apache.causeway.applib.annotation.Bounding;
 import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
@@ -40,10 +40,13 @@ import org.springframework.context.annotation.Profile;
 )
 @EntityListeners(CausewayEntityListener.class)
 @Named("demo.DomainObjectBounding")
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
+        nature = Nature.ENTITY,
         bounding = Bounding.BOUNDED         // <.>
 )
-@NoArgsConstructor
 public class DomainObjectBoundingJpa extends DomainObjectBounding {
     // ...
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/DomainObjectEditingVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/DomainObjectEditingVm.layout.xml
index 319686dee1..d10fab04a4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/DomainObjectEditingVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/DomainObjectEditingVm.layout.xml
@@ -34,14 +34,15 @@
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
 				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/jpa/DomainObjectEditingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/jpa/DomainObjectEditingJpa.java
index 4734977dcc..97e8fe4454 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/jpa/DomainObjectEditingJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/editing/jpa/DomainObjectEditingJpa.java
@@ -26,15 +26,14 @@ import lombok.Setter;
 import javax.inject.Named;
 import javax.persistence.*;
 
-import org.apache.causeway.applib.annotation.Bounding;
 import org.apache.causeway.applib.annotation.DomainObject;
 import org.apache.causeway.applib.annotation.Editing;
+import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
@@ -42,11 +41,15 @@ import org.springframework.context.annotation.Profile;
 )
 @EntityListeners(CausewayEntityListener.class)
 @Named("demo.DomainObjectEditing")
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
+        nature = Nature.ENTITY,
         editing = Editing.ENABLED               // <.>
 )
-@NoArgsConstructor
-public class DomainObjectEditingJpa extends DomainObjectEditing {
+public class DomainObjectEditingJpa
+                extends DomainObjectEditing {
     // ...
 //end::class[]
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.layout.xml
index 48b8555132..ab9154b267 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.layout.xml
@@ -26,27 +26,50 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:fieldSet name="Property edits" id="property"/>
-					<cpt:fieldSet name="Action invocations" id="action"/>
-				</bs3:col>
-			</bs3:row>
-			<bs3:row>
-				<bs3:col span="12">
-					<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-				</bs3:col>
-			</bs3:row>
+			<bs3:tabGroup>
+				<bs3:tab name="General">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="General" id="general" >
+								<cpt:property id="name"/>
+								<cpt:property id="originalName"/>
+								<cpt:property id="initialCharacter"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Metadata">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Metadata" id="metadata" >
+								<cpt:property id="id"/>
+								<cpt:property id="logicalTypeName"/>
+								<cpt:property id="version"/>
+							</cpt:fieldSet>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Other">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+			</bs3:tabGroup>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
 				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.layout.xml
index 2af21bdf97..854c4942a3 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.layout.xml
@@ -34,14 +34,15 @@
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
 				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
                 <cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jdo/DomainObjectEntityChangePublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jdo/DomainObjectEntityChangePublishingJdo.java
index 472683729d..9d7c3e43ee 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jdo/DomainObjectEntityChangePublishingJdo.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jdo/DomainObjectEntityChangePublishingJdo.java
@@ -32,17 +32,14 @@ import org.apache.causeway.applib.annotation.*;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jdo")
-//tag::class[]
 @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo")
 @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
 @Named("demo.DomainObjectEntityChangePublishingEntity")
+//tag::class[]
+// ...
 @DomainObject(
     nature=Nature.ENTITY
     , entityChangePublishing = Publishing.ENABLED            // <.>
-    , bounding = Bounding.BOUNDED
-)
-@DomainObjectLayout(
-    describedAs = "@DomainObject(entityChangePublishing=ENABLED)"
 )
 public class DomainObjectEntityChangePublishingJdo
                 extends DomainObjectEntityChangePublishingEntity {
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jpa/DomainObjectEntityChangePublishingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jpa/DomainObjectEntityChangePublishingJpa.java
index 4c5b46eaf1..43184ac9b0 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jpa/DomainObjectEntityChangePublishingJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/jpa/DomainObjectEntityChangePublishingJpa.java
@@ -31,7 +31,6 @@ import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityList
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
@@ -39,15 +38,13 @@ import org.springframework.context.annotation.Profile;
 )
 @EntityListeners(CausewayEntityListener.class)
 @Named("demo.DomainObjectEntityChangePublishingEntity")
-@DomainObject(
-        nature=Nature.ENTITY
-        , entityChangePublishing = Publishing.ENABLED            // <.>
-        , bounding = Bounding.BOUNDED
-    )
-    @DomainObjectLayout(
-        describedAs = "@DomainObject(entityChangePublishing=ENABLED)"
-    )
 @NoArgsConstructor
+//tag::class[]
+// ...
+@DomainObject(
+        nature=Nature.ENTITY,
+        entityChangePublishing = Publishing.ENABLED              // <.>
+)
 public class DomainObjectEntityChangePublishingJpa
                 extends DomainObjectEntityChangePublishingEntity {
     // ...
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.java
similarity index 67%
copy from examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.java
index dfc653ed06..43d4b633d3 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.java
@@ -16,13 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package demoapp.dom._infra.values;
+package demoapp.dom.domain.objects.DomainObject.introspection;
 
-import javax.inject.Named;
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
 
-@Named("demo.ValueHolder")
-public interface ValueHolder<T> {
+@SuppressWarnings("CdiManagedBeanInconsistencyInspection")
+public interface DomainObjectIntrospection
+        extends
+        HasAsciiDocDescription,
+        ValueHolder<String> {
 
-    T value();
+    default String title() { return value(); }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java
index 730f1aba42..d3f5c0d630 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java
@@ -18,6 +18,8 @@
  */
 package demoapp.dom.domain.objects.DomainObject.introspection;
 
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
 import javax.inject.Named;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -28,8 +30,6 @@ import org.apache.causeway.applib.annotation.DomainObject;
 import org.apache.causeway.applib.annotation.Introspection;
 import org.apache.causeway.applib.annotation.ObjectSupport;
 
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-
 //tag::class[]
 @XmlRootElement(name = "root")
 @XmlType
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.layout.xml
index b4f853de75..885160ce25 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.layout.xml
@@ -10,10 +10,10 @@
 	OF ANY KIND, either express or implied. See the License for the specific
 	language governing permissions and limitations under the License. -->
 <bs3:grid
-        xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
-        xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
-        xmlns:cpt="https://causeway.apache.org/applib/layout/component"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+		xsi:schemaLocation="https://causeway.apache.org/applib/layout/component https://causeway.apache.org/applib/layout/component/component.xsd   https://causeway.apache.org/applib/layout/grid/bootstrap3 https://causeway.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+		xmlns:bs3="https://causeway.apache.org/applib/layout/grid/bootstrap3"
+		xmlns:cpt="https://causeway.apache.org/applib/layout/component"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
 	<bs3:row>
 		<bs3:col span="10" unreferencedActions="true">
@@ -27,21 +27,26 @@
 	<bs3:row>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<cpt:collection id="annotationRequired" paged="5"/>
+			<cpt:collection id="annotationOptional" paged="5"/>
+			<cpt:collection id="encapsulationEnabled" paged="5"/>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
 				<cpt:action id="clearHints" position="PANEL" />
-				<cpt:action id="downloadLayoutXml"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="rebuildMetamodel" position="PANEL"/>
-				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadLayout"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="inspectMetamodel"  position="PANEL_DROPDOWN"/>
-                <cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
-				<cpt:action id="downloadJdoMetadata"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadMetamodelXml"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="downloadJdoMetamodel"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentCommands"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentExecutions"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="recentAuditTrailEntries"  position="PANEL_DROPDOWN"/>
+				<cpt:action id="impersonateWithRoles"  position="PANEL_DROPDOWN"/>
 				<cpt:action id="openRestApi" position="PANEL_DROPDOWN" />
 				<cpt:property id="description"/>
 			</cpt:fieldSet>
-		</bs3:col>
-	</bs3:row>
+		</bs3:col>	</bs3:row>
 	<bs3:row>
 		<bs3:col span="12" unreferencedCollections="true"/>
 	</bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm_annotationOptional.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm_annotationOptional.java
new file mode 100644
index 0000000000..af1154de82
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm_annotationOptional.java
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package demoapp.dom.domain.objects.DomainObject.introspection;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotOpt.DomainObjectIntrospectionAnnotOpt;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.DomainObjectIntrospectionAnnotReqd;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.annotation.Collection;
+import org.apache.causeway.applib.annotation.CollectionLayout;
+import org.apache.causeway.applib.annotation.MemberSupport;
+
+@Collection()
+@CollectionLayout()
+@RequiredArgsConstructor
+public class DomainObjectIntrospectionVm_annotationOptional {
+
+    @SuppressWarnings("unused")
+    private final DomainObjectIntrospectionVm mixee;
+
+    @MemberSupport
+    public List<? extends DomainObjectIntrospectionAnnotOpt> coll() {
+        return entities.all();
+    }
+
+    @Inject ValueHolderRepository<String, ? extends DomainObjectIntrospectionAnnotOpt> entities;
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm_annotationRequired.java
similarity index 51%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm_annotationRequired.java
index 730f1aba42..7c7cb3e4fc 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospectionVm_annotationRequired.java
@@ -18,30 +18,31 @@
  */
 package demoapp.dom.domain.objects.DomainObject.introspection;
 
-import javax.inject.Named;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Introspection;
-import org.apache.causeway.applib.annotation.ObjectSupport;
-
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-
-//tag::class[]
-@XmlRootElement(name = "root")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.DomainObjectIntrospectionVm")
-@DomainObject(
-        introspection = Introspection.ENCAPSULATION_ENABLED)
-public class DomainObjectIntrospectionVm implements HasAsciiDocDescription {
-
-    @ObjectSupport public String title() {
-        return "DomainObject#introspection";
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.DomainObjectIntrospectionAnnotReqd;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.annotation.Collection;
+import org.apache.causeway.applib.annotation.CollectionLayout;
+import org.apache.causeway.applib.annotation.MemberSupport;
+
+@Collection()
+@CollectionLayout()
+@RequiredArgsConstructor
+public class DomainObjectIntrospectionVm_annotationRequired {
+
+    @SuppressWarnings("unused")
+    private final DomainObjectIntrospectionVm mixee;
+
+    @MemberSupport
+    public List<? extends DomainObjectIntrospectionAnnotReqd> coll() {
+        return entities.all();
     }
 
+    @Inject ValueHolderRepository<String, ? extends DomainObjectIntrospectionAnnotReqd> entities;
+
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.java
index d2a736822f..604f0f24a6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.java
@@ -20,19 +20,14 @@ package demoapp.dom.domain.objects.DomainObject.introspection.annotOpt;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom._infra.values.ValueHolder;
+import demoapp.dom.domain.objects.DomainObject.introspection.DomainObjectIntrospection;
 
 import org.apache.causeway.applib.annotation.Editing;
 import org.apache.causeway.applib.annotation.Property;
 
 @SuppressWarnings("CdiManagedBeanInconsistencyInspection")
 public abstract class DomainObjectIntrospectionAnnotOpt
-        implements
-        HasAsciiDocDescription,
-        ValueHolder<String> {
-
-    public String title() {
-        return value();
-    }
+        implements DomainObjectIntrospection {
 
     @Override
     public String value() {
@@ -42,9 +37,4 @@ public abstract class DomainObjectIntrospectionAnnotOpt
     public abstract String getName();
     public abstract void setName(String value);
 
-    @Property(editing = Editing.DISABLED, editingDisabledReason = "This property cannot be edited")
-    public abstract String getOriginalName();
-    public abstract void setOriginalName(String value);
-
-    public abstract Character getInitialCharacter();
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.layout.xml
similarity index 89%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.layout.xml
index 691a0c6d47..cbf8d42c65 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/DomainObjectIntrospectionAnnotOpt.layout.xml
@@ -31,30 +31,30 @@
 					<bs3:row>
 						<bs3:col span="12">
 							<cpt:fieldSet name="General" id="general" >
-								<cpt:property id="name"/>
-								<cpt:property id="originalName"/>
-								<cpt:property id="initialCharacter"/>
+								<cpt:property id="name">
+									<cpt:action id="updateName"/>
+								</cpt:property>
 							</cpt:fieldSet>
 						</bs3:col>
 					</bs3:row>
 				</bs3:tab>
 				<bs3:tab name="Metadata">
-					<bs3:row>
-						<bs3:col span="12">
+			<bs3:row>
+				<bs3:col span="12">
 							<cpt:fieldSet name="Metadata" id="metadata" >
 								<cpt:property id="id"/>
 								<cpt:property id="logicalTypeName"/>
 								<cpt:property id="version"/>
 							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
+				</bs3:col>
+			</bs3:row>
 				</bs3:tab>
 				<bs3:tab name="Other">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-						</bs3:col>
-					</bs3:row>
+			<bs3:row>
+				<bs3:col span="12">
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+				</bs3:col>
+			</bs3:row>
 				</bs3:tab>
 			</bs3:tabGroup>
 		</bs3:col>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa-description.adoc
index afff1e85cc..9958511944 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa-description.adoc
@@ -1,10 +1,14 @@
 :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 [...]
 
-In this demo app, property editing has been disabled by default, but has been explicitly enabled for this class:
+The introspection of this domain object indicates that annotations are optional, for both member and any supporting methods.
 
 [source,java,indent=0]
 .DomainObjectIntrospectionAnnotOptJpa.java
 ----
 include::DomainObjectIntrospectionAnnotOptJpa.java[tags=class]
 ----
-<.> xxx
+<.> no need to annotate as `@Property`
++
+It would also be ok to remove the methods but then annotate the field with `@lombok.Getter` and `@lombok.Setter`
+<.> no need to annotate as `@Action`
+<.> no need to annotate as `@MemberSupport` or `@Domain.Include`
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa.java
index 9362092c19..b40176bf02 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotOpt/jpa/DomainObjectIntrospectionAnnotOptJpa.java
@@ -18,7 +18,7 @@
  */
 package demoapp.dom.domain.objects.DomainObject.introspection.annotOpt.jpa;
 
-import demoapp.dom.domain.objects.DomainObject.editing.DomainObjectEditing;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotOpt.DomainObjectIntrospectionAnnotOpt;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -27,32 +27,31 @@ import javax.inject.Named;
 import javax.persistence.*;
 
 import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Editing;
 import org.apache.causeway.applib.annotation.Introspection;
-import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
-    name = "DomainObjectIntrospectionJpa"
+    name = "DomainObjectIntrospectionAnnotOptJpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo.DomainObjectIntrospection")
+@Named("demo.DomainObjectIntrospectionAnnotOpt")
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
-        introspection = Introspection.ANNOTATION_REQUIRED
+        introspection = Introspection.ANNOTATION_OPTIONAL
 )
-@NoArgsConstructor
-public class DomainObjectIntrospectionAnnotOptJpa extends DomainObjectEditing {
+public class DomainObjectIntrospectionAnnotOptJpa
+        extends DomainObjectIntrospectionAnnotOpt {
     // ...
 //end::class[]
 
     public DomainObjectIntrospectionAnnotOptJpa(String value) {
         setName(value);
-        setOriginalName(value);
     }
 
     @Id
@@ -60,22 +59,20 @@ public class DomainObjectIntrospectionAnnotOptJpa extends DomainObjectEditing {
     private Long id;
 //tag::class[]
 
-    @Getter @Setter
-    private String name;                        // <.>
-
-    @Property(
-            editing = Editing.DISABLED,         // <.>
-            editingDisabledReason = "This property may not be edited"
-    )
-    @Getter @Setter
-    private String originalName;
-
-    public Character getInitialCharacter() {    // <.>
-        return getName().charAt(0);
+    private String name;                                                        // <.>
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
     }
-//end::class[]
-
 
-//tag::class[]
+    public DomainObjectIntrospectionAnnotOptJpa updateName(final String name) { // <.>
+        setName(name);
+        return this;
+    }
+    public String default0UpdateName() {                                        // <.>
+        return getName();
+    }
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.java
index 3668b3abe3..c4aa910962 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.java
@@ -20,19 +20,14 @@ package demoapp.dom.domain.objects.DomainObject.introspection.annotReqd;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom._infra.values.ValueHolder;
+import demoapp.dom.domain.objects.DomainObject.introspection.DomainObjectIntrospection;
 
 import org.apache.causeway.applib.annotation.Editing;
 import org.apache.causeway.applib.annotation.Property;
 
 @SuppressWarnings("CdiManagedBeanInconsistencyInspection")
 public abstract class DomainObjectIntrospectionAnnotReqd
-        implements
-        HasAsciiDocDescription,
-        ValueHolder<String> {
-
-    public String title() {
-        return value();
-    }
+        implements DomainObjectIntrospection {
 
     @Override
     public String value() {
@@ -41,10 +36,4 @@ public abstract class DomainObjectIntrospectionAnnotReqd
 
     public abstract String getName();
     public abstract void setName(String value);
-
-    @Property(editing = Editing.DISABLED, editingDisabledReason = "This property cannot be edited")
-    public abstract String getOriginalName();
-    public abstract void setOriginalName(String value);
-
-    public abstract Character getInitialCharacter();
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.layout.xml
similarity index 89%
copy from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.layout.xml
index 691a0c6d47..cbf8d42c65 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/DomainObjectIntrospectionAnnotReqd.layout.xml
@@ -31,30 +31,30 @@
 					<bs3:row>
 						<bs3:col span="12">
 							<cpt:fieldSet name="General" id="general" >
-								<cpt:property id="name"/>
-								<cpt:property id="originalName"/>
-								<cpt:property id="initialCharacter"/>
+								<cpt:property id="name">
+									<cpt:action id="updateName"/>
+								</cpt:property>
 							</cpt:fieldSet>
 						</bs3:col>
 					</bs3:row>
 				</bs3:tab>
 				<bs3:tab name="Metadata">
-					<bs3:row>
-						<bs3:col span="12">
+			<bs3:row>
+				<bs3:col span="12">
 							<cpt:fieldSet name="Metadata" id="metadata" >
 								<cpt:property id="id"/>
 								<cpt:property id="logicalTypeName"/>
 								<cpt:property id="version"/>
 							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
+				</bs3:col>
+			</bs3:row>
 				</bs3:tab>
 				<bs3:tab name="Other">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-						</bs3:col>
-					</bs3:row>
+			<bs3:row>
+				<bs3:col span="12">
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+				</bs3:col>
+			</bs3:row>
 				</bs3:tab>
 			</bs3:tabGroup>
 		</bs3:col>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa-description.adoc
index 12b750fe63..29f076b628 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa-description.adoc
@@ -1,10 +1,14 @@
 :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 [...]
 
-In this demo app, property editing has been disabled by default, but has been explicitly enabled for this class:
+The introspection of this domain object indicates that annotations are required for both member and any supporting methods.
 
 [source,java,indent=0]
 .DomainObjectIntrospectionAnnotReqdJpa.java
 ----
 include::DomainObjectIntrospectionAnnotReqdJpa.java[tags=class]
 ----
-<.> xxx
+<.> must annotate as `@Property`.
++
+It would also be ok to remove the methods but then annotate the field with `@Property` and also with `@lombok.Getter` and `@lombok.Setter`
+<.> must annotate as `@Action`
+<.> must annotate as `@MemberSupport` or `@Domain.Include`
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa.java
index f125a9dcb2..9ee6c29769 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/annotReqd/jpa/DomainObjectIntrospectionAnnotReqdJpa.java
@@ -18,7 +18,8 @@
  */
 package demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.jpa;
 
-import demoapp.dom.domain.objects.DomainObject.editing.DomainObjectEditing;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotOpt.jpa.DomainObjectIntrospectionAnnotOptJpa;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.DomainObjectIntrospectionAnnotReqd;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -26,33 +27,31 @@ import lombok.Setter;
 import javax.inject.Named;
 import javax.persistence.*;
 
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Editing;
-import org.apache.causeway.applib.annotation.Introspection;
-import org.apache.causeway.applib.annotation.Property;
+import org.apache.causeway.applib.annotation.*;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
-    name = "DomainObjectIntrospectionJpa"
+    name = "DomainObjectIntrospectionAnnotReqdJpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo.DomainObjectIntrospection")
+@Named("demo.DomainObjectIntrospectionAnnotReqdJpa")
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
         introspection = Introspection.ANNOTATION_REQUIRED
 )
-@NoArgsConstructor
-public class DomainObjectIntrospectionAnnotReqdJpa extends DomainObjectEditing {
+public class DomainObjectIntrospectionAnnotReqdJpa
+        extends DomainObjectIntrospectionAnnotReqd {
     // ...
 //end::class[]
 
     public DomainObjectIntrospectionAnnotReqdJpa(String value) {
         setName(value);
-        setOriginalName(value);
     }
 
     @Id
@@ -60,22 +59,23 @@ public class DomainObjectIntrospectionAnnotReqdJpa extends DomainObjectEditing {
     private Long id;
 //tag::class[]
 
-    @Getter @Setter
-    private String name;                        // <.>
-
-    @Property(
-            editing = Editing.DISABLED,         // <.>
-            editingDisabledReason = "This property may not be edited"
-    )
-    @Getter @Setter
-    private String originalName;
-
-    public Character getInitialCharacter() {    // <.>
-        return getName().charAt(0);
+    private String name;
+    @Property                                                                   // <.>
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
     }
-//end::class[]
-
 
-//tag::class[]
+    @Action(semantics = SemanticsOf.IDEMPOTENT)                                 // <.>
+    public DomainObjectIntrospectionAnnotReqdJpa updateName(final String name) {
+        setName(name);
+        return this;
+    }
+    @MemberSupport                                                              // <.>
+    public String default0UpdateName() {
+        return getName();
+    }
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.java
index 050c290598..40e2160c48 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.java
@@ -20,31 +20,14 @@ package demoapp.dom.domain.objects.DomainObject.introspection.encapsulated;
 
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom._infra.values.ValueHolder;
+import demoapp.dom.domain.objects.DomainObject.introspection.DomainObjectIntrospection;
 
 import org.apache.causeway.applib.annotation.Editing;
+import org.apache.causeway.applib.annotation.Programmatic;
 import org.apache.causeway.applib.annotation.Property;
 
 @SuppressWarnings("CdiManagedBeanInconsistencyInspection")
 public abstract class DomainObjectIntrospectionEncapsulated
-        implements
-        HasAsciiDocDescription,
-        ValueHolder<String> {
+        implements DomainObjectIntrospection {
 
-    public String title() {
-        return value();
-    }
-
-    @Override
-    public String value() {
-        return getName();
-    }
-
-    public abstract String getName();
-    public abstract void setName(String value);
-
-    @Property(editing = Editing.DISABLED, editingDisabledReason = "This property cannot be edited")
-    public abstract String getOriginalName();
-    public abstract void setOriginalName(String value);
-
-    public abstract Character getInitialCharacter();
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.layout.xml
similarity index 89%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.layout.xml
index 691a0c6d47..cbf8d42c65 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/DomainObjectIntrospection.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/DomainObjectIntrospectionEncapsulated.layout.xml
@@ -31,30 +31,30 @@
 					<bs3:row>
 						<bs3:col span="12">
 							<cpt:fieldSet name="General" id="general" >
-								<cpt:property id="name"/>
-								<cpt:property id="originalName"/>
-								<cpt:property id="initialCharacter"/>
+								<cpt:property id="name">
+									<cpt:action id="updateName"/>
+								</cpt:property>
 							</cpt:fieldSet>
 						</bs3:col>
 					</bs3:row>
 				</bs3:tab>
 				<bs3:tab name="Metadata">
-					<bs3:row>
-						<bs3:col span="12">
+			<bs3:row>
+				<bs3:col span="12">
 							<cpt:fieldSet name="Metadata" id="metadata" >
 								<cpt:property id="id"/>
 								<cpt:property id="logicalTypeName"/>
 								<cpt:property id="version"/>
 							</cpt:fieldSet>
-						</bs3:col>
-					</bs3:row>
+				</bs3:col>
+			</bs3:row>
 				</bs3:tab>
 				<bs3:tab name="Other">
-					<bs3:row>
-						<bs3:col span="12">
-							<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-						</bs3:col>
-					</bs3:row>
+			<bs3:row>
+				<bs3:col span="12">
+			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+				</bs3:col>
+			</bs3:row>
 				</bs3:tab>
 			</bs3:tabGroup>
 		</bs3:col>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa-description.adoc
index 9a963d1904..e195ca2ab8 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa-description.adoc
@@ -1,10 +1,13 @@
 :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 [...]
 
-In this demo app, property editing has been disabled by default, but has been explicitly enabled for this class:
+The introspection of this domain object indicates that encapsulation is enabled, which means that annotations are mandatory but that the methods can have any visibility (even `private` visibility).
+Reducing the programmatic API of domain objects can help to eliminate bugs.
 
 [source,java,indent=0]
 .DomainObjectIntrospectionEncapsulatedJpa.java
 ----
 include::DomainObjectIntrospectionEncapsulatedJpa.java[tags=class]
 ----
-<.> xxx
+<.> must annotate as `@Property`, but can have any visibility
+<.> must annotate as `@Action`, but can have any visibility
+<.> must annotate as @`MemberSupport` or `@Domain.Include`, but can have any visibility
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa.java
index f8d212e9a4..ac70594623 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionEncapsulatedJpa.java
@@ -18,7 +18,7 @@
  */
 package demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.jpa;
 
-import demoapp.dom.domain.objects.DomainObject.editing.DomainObjectEditing;
+import demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.DomainObjectIntrospectionEncapsulated;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -26,33 +26,36 @@ import lombok.Setter;
 import javax.inject.Named;
 import javax.persistence.*;
 
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Editing;
-import org.apache.causeway.applib.annotation.Introspection;
-import org.apache.causeway.applib.annotation.Property;
+import org.apache.causeway.applib.annotation.*;
 import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
 import org.springframework.context.annotation.Profile;
 
 @Profile("demo-jpa")
-//tag::class[]
 @Entity
 @Table(
     schema = "demo",
-    name = "DomainObjectIntrospectionJpa"
+    name = "DomainObjectIntrospectionEncapsulatedJpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo.DomainObjectIntrospection")
+@Named("demo.DomainObjectIntrospectionEncapsulatedJpa")
+@NoArgsConstructor
+//tag::class[]
+// ...
 @DomainObject(
-        introspection = Introspection.ANNOTATION_REQUIRED
+        introspection = Introspection.ENCAPSULATION_ENABLED
 )
-@NoArgsConstructor
-public class DomainObjectIntrospectionEncapsulatedJpa extends DomainObjectEditing {
+public class DomainObjectIntrospectionEncapsulatedJpa
+        extends DomainObjectIntrospectionEncapsulated {
     // ...
 //end::class[]
 
     public DomainObjectIntrospectionEncapsulatedJpa(String value) {
         setName(value);
-        setOriginalName(value);
+    }
+
+    @Override
+    public String value() {
+        return getName();
     }
 
     @Id
@@ -60,22 +63,23 @@ public class DomainObjectIntrospectionEncapsulatedJpa extends DomainObjectEditin
     private Long id;
 //tag::class[]
 
-    @Getter @Setter
-    private String name;                        // <.>
-
-    @Property(
-            editing = Editing.DISABLED,         // <.>
-            editingDisabledReason = "This property may not be edited"
-    )
-    @Getter @Setter
-    private String originalName;
-
-    public Character getInitialCharacter() {    // <.>
-        return getName().charAt(0);
+    private String name;
+    @Property                                                                       // <.>
+    private String getName() {                                                      // <1>
+        return name;
+    }
+    private void setName(String name) {
+        this.name = name;
     }
-//end::class[]
-
 
-//tag::class[]
+    @Action(semantics = SemanticsOf.IDEMPOTENT)                                     // <.>
+    private DomainObjectIntrospectionEncapsulated updateName(final String name) {   // <2>
+        setName(name);
+        return this;
+    }
+    @MemberSupport                                                                  // <.>
+    private String default0UpdateName() {                                           // <3>
+        return getName();
+    }
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionVm_encapsulationEnabled.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionVm_encapsulationEnabled.java
new file mode 100644
index 0000000000..28d80ae196
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/introspection/encapsulated/jpa/DomainObjectIntrospectionVm_encapsulationEnabled.java
@@ -0,0 +1,52 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.jpa;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.objects.DomainObject.introspection.DomainObjectIntrospectionVm;
+import demoapp.dom.domain.objects.DomainObject.introspection.annotReqd.DomainObjectIntrospectionAnnotReqd;
+import demoapp.dom.domain.objects.DomainObject.introspection.encapsulated.DomainObjectIntrospectionEncapsulated;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.annotation.Collection;
+import org.apache.causeway.applib.annotation.CollectionLayout;
+import org.apache.causeway.applib.annotation.MemberSupport;
+import org.springframework.context.annotation.Profile;
+
+@Profile("demo-jpa")
+@Collection()
+@CollectionLayout()
+@RequiredArgsConstructor
+public class DomainObjectIntrospectionVm_encapsulationEnabled {
+
+    @SuppressWarnings("unused")
+    private final DomainObjectIntrospectionVm mixee;
+
+    @MemberSupport
+    public List<DomainObjectIntrospectionEncapsulatedJpa> coll() {
+        return entities.all();
+    }
+
+    @Inject ValueHolderRepository<String, DomainObjectIntrospectionEncapsulatedJpa> entities;
+
+}