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/04/10 11:59:34 UTC

[causeway] 12/13: CAUSEWAY-2485: completes @Property#hidden

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

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

commit 5ffb95e4661ac89b5263d03b010f9bdbe4f05f1a
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Apr 10 11:24:56 2023 +0100

    CAUSEWAY-2485: completes @Property#hidden
---
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |   2 +
 .../Action/hidden/ActionHidden-description.adoc    |  18 +-
 .../hidden/ActionHiddenPage-description.adoc       |  29 +++-
 .../hidden/ActionLayoutHidden-description.adoc     |  18 +-
 .../hidden/ActionLayoutHiddenPage-description.adoc |  28 ++-
 .../domain/properties/Property/PropertyMenu.java   |  15 +-
 .../hidden/HiddenEverywhereMetaAnnotation.java     |  42 -----
 .../hidden/PropertyHidden-description.adoc         |  42 +++++
 .../properties/Property/hidden/PropertyHidden.java |  73 ++++++++
 ...hildVm.layout.xml => PropertyHidden.layout.xml} |  43 ++++-
 .../hidden/PropertyHiddenPage-description.adoc     | 151 +++-------------
 .../Property/hidden/PropertyHiddenPage.java        | 100 +----------
 .../Property/hidden/PropertyHiddenPage.layout.xml  |  10 +-
 ..._mixinPropertyWithMetaAnnotationOverridden.java |  51 ------
 .../hidden/PropertyHiddenPage_objects.java         |  27 +++
 ...Children.java => PropertyHiddenRepository.java} |  22 +--
 ...aAnnotation.java => PropertyHiddenSeeding.java} |  41 ++---
 .../child/PropertyHiddenChildVm-description.adoc   |  52 ------
 .../hidden/child/PropertyHiddenChildVm.java        | 190 ---------------------
 .../child/PropertyHiddenChildVm_mixinProperty.java |  48 ------
 .../hidden/jpa/PropertyHiddenJpa-description.adoc  |   3 +
 .../Property/hidden/jpa/PropertyHiddenJpa.java     |  81 +++++++++
 .../hidden/jpa/PropertyHiddenJpaEntities.java      |  55 ++++++
 23 files changed, 434 insertions(+), 707 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 8ede406aa9..bef8a08a92 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java
@@ -47,6 +47,7 @@ import demoapp.dom.domain.objects.DomainObjectLayout.xxxUiEvent.jpa.DomainObject
 import demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa.NumberConstantJpa;
 import demoapp.dom.domain.properties.Property.commandPublishing.jpa.PropertyCommandPublishingJpa;
 import demoapp.dom.domain.properties.Property.executionPublishing.jpa.PropertyExecutionPublishingJpa;
+import demoapp.dom.domain.properties.Property.hidden.jpa.PropertyHiddenJpa;
 import demoapp.dom.domain.properties.Property.projecting.jpa.PropertyProjectingChildJpa;
 import demoapp.dom.services.core.eventbusservice.EventLogEntryJpa;
 import demoapp.dom.services.core.wrapperFactory.jpa.WrapperFactoryJpa;
@@ -140,6 +141,7 @@ import org.springframework.context.annotation.Profile;
         PropertyCommandPublishingJpa.class,
         PropertyExecutionPublishingJpa.class,
         PropertyProjectingChildJpa.class,
+        PropertyHiddenJpa.class,
 
         CausewayBlobJpa.class,
         CausewayClobJpa.class,
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHidden-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHidden-description.adoc
index 4314334a22..9020e184b7 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHidden-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHidden-description.adoc
@@ -17,15 +17,6 @@ include::ActionHidden_changeName.java[tags=class]
 ----
 <.> no `hidden` element specified, so implicitly visible
 
-* `hidden` everywhere:
-+
-[source,java]
-.ActionHidden_changeNameHiddenEverywhere.java
-----
-include::ActionHidden_changeNameHiddenEverywhere.java[tags=class]
-----
-<.> action should _NOT_ be visible for this entity.
-
 * `hidden` on object forms (but not necessarily on collections):
 +
 [source,java]
@@ -44,5 +35,14 @@ include::ActionHidden_changeNameHiddenAllTables.java[tags=class]
 ----
 <.> action _should_ be visible for this entity.
 
+* `hidden` everywhere:
++
+[source,java]
+.ActionHidden_changeNameHiddenEverywhere.java
+----
+include::ActionHidden_changeNameHiddenEverywhere.java[tags=class]
+----
+<.> action should _NOT_ be visible for this entity.
+
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenPage-description.adoc
index e8f93ffdce..fb61c4ad6a 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenPage-description.adoc
@@ -15,6 +15,7 @@ The four actions are:
 * `hidden` not specified:
 +
 [source,java]
+.ActionHidden_changeName.java
 ----
 include::ActionHidden_changeName.java[tags=class]
 ----
@@ -22,15 +23,6 @@ include::ActionHidden_changeName.java[tags=class]
 +
 However, the Wicket viewer does _not_ render actions on instances of collections, so the action will not in fact be shown as visible.
 
-* `hidden` everywhere:
-+
-[source,java]
-.ActionHidden_changeNameHiddenEverywhere.java
-----
-include::ActionHidden_changeNameHiddenEverywhere.java[tags=class]
-----
-<.> action should _NOT_ be visible for this entity.
-
 * `hidden` on object forms (but not necessarily on collections):
 +
 [source,java]
@@ -54,4 +46,23 @@ include::ActionHidden_changeNameHiddenAllTables.java[tags=class]
 Currently the Wicket viewer does _not_ render actions of instances of collections, and so none of these actions will be visible on this page.
 However, if you navigate into these domain objects then some of these actions will be visible.
 
+* `hidden` everywhere:
++
+[source,java]
+.ActionHidden_changeNameHiddenEverywhere.java
+----
+include::ActionHidden_changeNameHiddenEverywhere.java[tags=class]
+----
+<.> action should _NOT_ be visible for this entity.
+
+Currently the Wicket viewer does _not_ render actions of instances of collections, and so none of these actions will be visible on this page.
+However, if you navigate into these domain objects then some of these actions will be visible.
+
+[TIP]
+.What is the difference between a hidden action and one annotated with `@Programmatic` ?
+====
+Although there is no difference in the UI, a hidden action _is_ part of the metadamodel while a link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/annotation/Programmatic.html#hidden[@Programmatic] property is not.
 
+A rare (but valid) use case is to invoke such a hidden action using the link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/services/wrapper/WrapperFactory.html#wrap(t,-synccontrol)[@WrapperFactory] (skipping rules).
+This can be for example to publish executions to any registered link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/services/publishing/spi/ExecutionSubscriber.html[ExecutionSubscriber]s.
+====
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHidden-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHidden-description.adoc
index 118ee92daa..da728f7819 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHidden-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHidden-description.adoc
@@ -17,15 +17,6 @@ include::ActionLayoutHidden_changeName.java[tags=class]
 ----
 <.> no `hidden` element specified, so implicitly visible
 
-* `hidden` everywhere:
-+
-[source,java]
-.ActionLayoutHidden_changeNameHiddenEverywhere.java
-----
-include::ActionLayoutHidden_changeNameHiddenEverywhere.java[tags=class]
-----
-<.> action should _NOT_ be visible for this entity.
-
 * `hidden` on object forms (but not necessarily on collections):
 +
 [source,java]
@@ -44,5 +35,14 @@ include::ActionLayoutHidden_changeNameHiddenAllTables.java[tags=class]
 ----
 <.> action _should_ be visible for this entity.
 
+* `hidden` everywhere:
++
+[source,java]
+.ActionLayoutHidden_changeNameHiddenEverywhere.java
+----
+include::ActionLayoutHidden_changeNameHiddenEverywhere.java[tags=class]
+----
+<.> action should _NOT_ be visible for this entity.
+
 
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenPage-description.adoc
index 10b37509a2..d273db9ec4 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/hidden/ActionLayoutHiddenPage-description.adoc
@@ -23,15 +23,6 @@ include::ActionLayoutHidden_changeName.java[tags=class]
 +
 However, the Wicket viewer does _not_ render actions on instances of collections, so the action will not in fact be shown as visible.
 
-* `hidden` everywhere:
-+
-[source,java]
-.ActionLayoutHidden_changeNameHiddenEverywhere.java
-----
-include::ActionLayoutHidden_changeNameHiddenEverywhere.java[tags=class]
-----
-<.> action should _NOT_ be visible for this entity.
-
 * `hidden` on object forms (but not necessarily on collections):
 +
 [source,java]
@@ -55,4 +46,23 @@ include::ActionLayoutHidden_changeNameHiddenAllTables.java[tags=class]
 Currently the Wicket viewer does _not_ render actions of instances of collections, and so none of these actions will be visible on this page.
 However, if you navigate into these domain objects then some of these actions will be visible.
 
+* `hidden` everywhere:
++
+[source,java]
+.ActionLayoutHidden_changeNameHiddenEverywhere.java
+----
+include::ActionLayoutHidden_changeNameHiddenEverywhere.java[tags=class]
+----
+<.> action should _NOT_ be visible for this entity.
+
+Currently the Wicket viewer does _not_ render actions of instances of collections, and so none of these actions will be visible on this page.
+However, if you navigate into these domain objects then some of these actions will be visible.
+
+[TIP]
+.What is the difference between a hidden action and one annotated with `@Programmatic` ?
+====
+Although there is no difference in the UI, a hidden action _is_ part of the metadamodel while a link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/annotation/Programmatic.html#hidden[@Programmatic] property is not.
 
+A rare (but valid) use case is to invoke such a hidden action using the link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/services/wrapper/WrapperFactory.html#wrap(t,-synccontrol)[@WrapperFactory] (skipping rules).
+This can be for example to publish executions to any registered link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/services/publishing/spi/ExecutionSubscriber.html[ExecutionSubscriber]s.
+====
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
index 6653e57da9..e12701101b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/PropertyMenu.java
@@ -40,7 +40,6 @@ import demoapp.dom.domain.properties.Property.editingReasonDisabled.PropertyEdit
 import demoapp.dom.domain.properties.Property.executionPublishing.PropertyExecutionPublishingPage;
 import demoapp.dom.domain.properties.Property.fileAccept.PropertyFileAcceptPage;
 import demoapp.dom.domain.properties.Property.hidden.PropertyHiddenPage;
-import demoapp.dom.domain.properties.Property.hidden.child.PropertyHiddenChildVm;
 import demoapp.dom.domain.properties.Property.maxLength.PropertyMaxLengthPage;
 import demoapp.dom.domain.properties.Property.mustSatisfy.PropertyMustSatisfyPage;
 import demoapp.dom.domain.properties.Property.optionality.PropertyOptionalityPage;
@@ -119,19 +118,9 @@ public class PropertyMenu {
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of properties, eg in tables")
+    @ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of properties in different contexts")
     public PropertyHiddenPage hidden() {
-        val vm = new PropertyHiddenPage();
-        vm.setPropertyHiddenAnywhere("hidden anywhere");
-        vm.setPropertyHiddenEverywhere("hidden everywhere");
-        vm.setPropertyHiddenNowhereUsingAnnotation("hidden nowhere using annotation");
-        vm.setPropertyUsingMetaAnnotation("using meta-annotation");
-        vm.setPropertyUsingMetaAnnotationButOverridden("using meta-annotation but overridden");
-
-        vm.getChildren().add(new PropertyHiddenChildVm("child 1", vm));
-        vm.getChildren().add(new PropertyHiddenChildVm("child 2", vm));
-        vm.getChildren().add(new PropertyHiddenChildVm("child 3", vm));
-        return vm;
+        return new PropertyHiddenPage();
     }
 
     @Action(semantics = SemanticsOf.SAFE)
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/HiddenEverywhereMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/HiddenEverywhereMetaAnnotation.java
deleted file mode 100644
index 2945f0a345..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/HiddenEverywhereMetaAnnotation.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.Property.hidden;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.Where;
-
-//tag::class[]
-@Property(hidden = Where.EVERYWHERE)                // <.>
-@Inherited
-@Target({
-        ElementType.METHOD, ElementType.FIELD,      // <.>
-        ElementType.PARAMETER,                      // <.>
-        ElementType.TYPE                            // <.>
-})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface HiddenEverywhereMetaAnnotation {
-
-}
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden-description.adoc
new file mode 100644
index 0000000000..1d51454731
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden-description.adoc
@@ -0,0 +1,42 @@
+:Notice: Licensed to the Apache 1Software 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 a [...]
+
+This domain class is used in the demo of `@Property#hidden`.
+
+=== How this demo works
+
+This entity defines four properties, and depending upon context, they may be visible on an object form or when rendered in a collection.
+
+From this page, you can inspect the visibility of the actions from the context of an object form:
+
+* `hidden` not specified:
++
+[source,java,indent=0]
+----
+include::PropertyHidden.java[tags=none]
+----
+<.> property _should_ be visible for this entity on both object forms and collections.
+
+* `hidden` on object forms, but not hidden in collections:
++
+[source,java,indent=0]
+----
+include::PropertyHidden.java[tags=object-forms]
+----
+<.> property should _NOT_ be visible on this page
+
+* `hidden` on collections:
++
+[source,java,indent=0]
+----
+include::PropertyHidden.java[tags=all-tables]
+----
+<.> property _should_ be visible on this page.
+
+* `hidden` everywhere:
++
+[source,java,indent=0]
+----
+include::PropertyHidden.java[tags=everywhere]
+----
+<.> property should never be visible for this entity
+
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden.java
new file mode 100644
index 0000000000..e7c1fe6a99
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden.java
@@ -0,0 +1,73 @@
+/*
+ *  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.properties.Property.hidden;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
+
+import org.apache.causeway.applib.annotation.Property;
+import org.apache.causeway.applib.annotation.Where;
+
+//tag::class[]
+public abstract class PropertyHidden
+//end::class[]
+        implements
+        HasAsciiDocDescription,
+        ValueHolder<String>
+//tag::class[]
+{
+    // ...
+//end::class[]
+    public String title() {
+        return value();
+    }
+
+    @Override
+    public String value() {
+        return getName();
+    }
+
+
+//tag::none[]
+    @Property()                                     // <.>
+    public abstract String getName();
+    public abstract void setName(String value);
+//end::none[]
+
+//tag::object-forms[]
+    @Property(hidden = Where.OBJECT_FORMS)          // <.>
+    public abstract String getNameHiddenObjectForms();
+    public abstract void setNameHiddenObjectForms(String value);
+//end::object-forms[]
+
+//tag::all-tables[]
+    @Property(hidden = Where.ALL_TABLES)            // <.>
+    public abstract String getNameHiddenAllTables();
+    public abstract void setNameHiddenAllTables(String value);
+//end::all-tables[]
+
+//tag::everywhere[]
+    @Property(hidden = Where.EVERYWHERE)            // <.>
+    public abstract String getNameHiddenEverywhere();
+    public abstract void setNameHiddenEverywhere(String value);
+//end::everywhere[]
+
+//tag::class[]
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden.layout.xml
similarity index 71%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.layout.xml
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden.layout.xml
index e3d93da996..3b16f6bd2c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHidden.layout.xml
@@ -15,11 +15,9 @@
         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">
 			<cpt:domainObject />
-			<cpt:action id="returnsStandaloneList"/>
 		</bs3:col>
 		<bs3:col span="2">
 			<cpt:fieldSet name="" id="sources" />
@@ -28,10 +26,38 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<cpt:fieldSet name="Properties" id="variants"/>
-			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
-			<cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/>
-			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+			<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="nameHiddenObjectForms"/>
+								<cpt:property id="nameHiddenAllTables"/>
+								<cpt:property id="nameHiddenEverywhere"/>
+							</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" >
@@ -50,6 +76,11 @@
 			</cpt:fieldSet>
 		</bs3:col>
 	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12">
+			<cpt:collection id="publishedCommands"/>
+		</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/properties/Property/hidden/PropertyHiddenPage-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage-description.adoc
index 78f613df46..c6f4fca906 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage-description.adoc
@@ -1,154 +1,57 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 
-The `hidden` element indicates that the property should be hidden in certain contexts.
-Most commonly, this is to hide properties in tables (parented, standalone, or both).
+The link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/annotation/Property.html#hidden[@Property#hidden] element specifies whether a property should be visible in the UI or not.
 
-* for properties, the element can be specified using either the `@Property` annotation, or a meta-annotation.
+=== How this demo works
 
-* there is no equivalent for a  parameter (though parameters can be hidden dynamically using a `hide...()` supporting method)
+The collection on the left hand side shows a set of domain objects.
+That domain object defines four properties, and depending upon context, they may be visible on an object form or when rendered in a collection.
+From this page, you can inspect the visibility of the actions from the context of a parented collection.
 
-Because some of the `hidden` variants relate to tables, this view model has a collection of child objects with those child objects annotated to show the relevant options.
-There is also an action that returns this same set of child objects as a standalone list.
+Navigate into each domain object to inspect the visibility of the actions on an object form.
 
-[NOTE]
-====
-It is also specify to hide properties using `@PropertyLayout`.
-This is to allow the distinction between a property that is hidden as a deep domain concept, compared to a property that is hidden in some circumstances for cosmetic UI reasons.
-
-In the user interface, the effect is the same.
-====
+The four properties are:
 
-== Annotated
-
-The `hidden` element can be specified explicitly using an annotation:
-
-* for properties, using `@Property#hidden()`:
+* `hidden` not specified:
 +
 [source,java,indent=0]
 ----
-include::PropertyHiddenPage.java[tags=annotation]
+include::PropertyHidden.java[tags=none]
 ----
-<.> explicitly indicate that the property should be visible in all contexts.
-
-Note that there is no equivalent for `@Parameter`.
-
-== Variants
-
-The table below lists the properties of this object, and the context (if any) in which it should be visible.
-
-NOTE: there are other variants, the child object has all possible variants.
-
-.Hidden Variants
-[cols="^1m,2m,2a",options=header,frame="all"]
-|===
-^| Where
-^| This object
-^| Notes
-
-| NOWHERE
-| propertyHiddenNowhereUsingAnnotation
-propertyHiddenNowhereUsingLayout
-propertyUsingMetaAnnotationButOverridden
-| Visible at all times
-
-| EVERYWHERE
-| propertyHiddenEverywhere
-propertyUsingMetaAnnotation
-| Should not be visible at all.
+<.> property should be visible for this entity on both object forms and collections.
 
-| ANYWHERE
-| propertyHiddenAnywhere
-| Should not be visible at all +
-(synonym for EVERYWHERE)
-
-|===
-
-The source for the `propertyHiddenNowhereUsingAnnotation` property is quoted above; but the other two properties are:
-
-* Everywhere:
+* `hidden` on object forms, but not hidden in collections:
 +
 [source,java,indent=0]
 ----
-include::PropertyHiddenPage.java[tags=variants-everywhere]
+include::PropertyHidden.java[tags=object-forms]
 ----
+<.> property _should_ be visible in the table
 
-* Anywhere:
+* `hidden` on collections:
 +
 [source,java,indent=0]
 ----
-include::PropertyHiddenPage.java[tags=variants-anywhere]
-----
-
-Neither of these properties should be visible in the UI.
-
-
-== Meta-annotated
-
-The `hidden` element can also be specified using a custom meta-annotation:
-
-* the meta-annotation is defined as:
-+
-[source,java]
-----
-include::HiddenEverywhereMetaAnnotation.java[tags=class]
+include::PropertyHidden.java[tags=all-tables]
 ----
-<.> annotated for a property .
-<.> annotation can be applied to a property (either its getter or the field directly)
-<.> annotation can be applied to a parameter
-<.> annotation can be applied to a type (ie, meta-meta annotations recursively)
+<.> property should _NOT_ be visible in the table.
 
-* and can be applied to a property:
+* `hidden` everywhere:
 +
 [source,java,indent=0]
 ----
-include::PropertyHiddenPage.java[tags=meta-annotated]
+include::PropertyHidden.java[tags=everywhere]
 ----
-<.> hint is inherited from the meta-annotation
-
-* or can be applied to mixin:
-+
-[source,java,indent=0]
-----
-include::PropertyHiddenPage_mixinPropertyWithMetaAnnotation.java[tags=class]
-----
-<.> hint is inherited from the meta-annotation
-
-Neither of these properties should be visible in the UI.
-
-=== Meta-annotated Overridden
-
-The meta-annotation can itself be overridden:
-
-* in a property:
-+
-[source,java,indent=0]
-----
-include::PropertyHiddenPage.java[tags=meta-annotated-overridden]
-----
-<.> hint from meta-annotation ...
-<.> \... is overridden by the `@Property` annotation
+<.> property should never be visible for this entity
 
+If you navigate into these domain objects then different properties will be visble due to the changed context.
 
-* or a mixin:
-+
-[source,java,indent=0]
-----
-include::PropertyHiddenPage_mixinPropertyWithMetaAnnotationOverridden.java[tags=meta-annotation-overridden]
-----
-<.> hint from meta-annotation ...
-<.> \... is overridden by the `@Parameter` annotation
-
-In both cases, even though the meta-annotation indicates that the property should be hidden everywhere, the override indicates that they should be hidden nowhere.
-Both properties should therefore be visible in the UI.
-
-== Children
-
-The `children` collection illustrates the visibility of the child objects' properties when viewed in a collection:
-
-* the `propertyHiddenObjectForms` property is visible as a column in the collection, but won't be visible in the object's page itself
-
-* the `propertyHiddenStandalone` property similarly is visible here, but won't be visible in the standalone list returned by the "returns children" action
+[TIP]
+.What is the difference between a hidden property and one annotated with `@Programmatic` ?
+====
+Although there is no difference in the UI, a hidden property _is_ part of the metadamodel while a link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/annotation/Programmatic.html#hidden[@Programmatic] property is not.
 
-* the `propertyHiddenNowhere` property similar is visible here, and will also be visible on the object's page.
+A rare (but valid) use case is to invoke such a hidden property using the link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/services/wrapper/WrapperFactory.html#wrap(t,-synccontrol)[@WrapperFactory] (skipping rules).
+This can be for example to publish executions to any registered link:https://causeway.apache.org/refguide/2.0.0-SNAPSHOT/applib/index/services/publishing/spi/ExecutionSubscriber.html[ExecutionSubscriber]s.
+====
 
-The child object has a number of other properties, each using a different `hidden` variant; click through to inspect.
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.java
index 2e51595c6a..596c049820 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.java
@@ -18,119 +18,35 @@
  */
 package demoapp.dom.domain.properties.Property.hidden;
 
-import java.util.ArrayList;
-import java.util.List;
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import lombok.NoArgsConstructor;
 
 import javax.inject.Named;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.causeway.applib.annotation.Collection;
 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.ObjectSupport;
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Where;
-
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-import demoapp.dom.domain.properties.Property.hidden.child.PropertyHiddenChildVm;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
 
-//tag::class[]
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.PropertyHiddenVm")
+@Named("demo.PropertyHiddenPage")
 @DomainObject(
-        nature=Nature.VIEW_MODEL,
-        editing = Editing.ENABLED)
+    nature=Nature.VIEW_MODEL)
 @NoArgsConstructor
+//tag::class[]
 public class PropertyHiddenPage implements HasAsciiDocDescription {
+    // ...
+//end::class[]
 
     @ObjectSupport public String title() {
         return "@Property#hidden";
     }
 
-//tag::annotation[]
-    @Property(
-        hidden = Where.NOWHERE                           // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.NOWHERE)",
-        fieldSetId = "annotation", sequence = "1")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenNowhereUsingAnnotation;
-//end::annotation[]
-
-//tag::variants-everywhere[]
-    @Property(
-        hidden = Where.EVERYWHERE                       // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.EVERYWHERE)",
-        fieldSetId = "variants", sequence = "1")
-    @XmlElement(required = true)
-    @Getter @Setter
-    private String propertyHiddenEverywhere;
-//end::variants-everywhere[]
-
-//tag::variants-anywhere[]
-    @Property(
-        hidden = Where.ANYWHERE                       // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.ANYWHERE)",
-        fieldSetId = "variants", sequence = "2")
-    @XmlElement(required = true)
-    @Getter @Setter
-    private String propertyHiddenAnywhere;
-//end::variants-anywhere[]
-
-//tag::children[]
-    @Getter @Setter
-    @Collection
-    @XmlElementWrapper(name = "children")
-    @XmlElement(name = "child")
-    private List<PropertyHiddenChildVm> children = new ArrayList<>();
-//end::children[]
-
-//tag::meta-annotated[]
-    @HiddenEverywhereMetaAnnotation                        // <.>
-    @Property()
-    @PropertyLayout(
-        describedAs = "@HiddenEverywhereMetaAnnotation",
-        fieldSetId = "meta-annotated", sequence = "1")
-    @XmlElement(required = true)
-    @Getter @Setter
-    private String propertyUsingMetaAnnotation;
-//end::meta-annotated[]
-
-//tag::meta-annotated-overridden[]
-    @HiddenEverywhereMetaAnnotation                     // <.>
-    @Property(
-        hidden = Where.NOWHERE                          // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@HiddenEverywhereMetaAnnotation " +
-            "@Property(hidden = Where.NOWHERE)",
-        fieldSetId = "meta-annotated-overridden", sequence = "2")
-    @XmlElement(required = true)
-    @Getter @Setter
-    private String propertyUsingMetaAnnotationButOverridden;
-//end::meta-annotated-overridden[]
-
+//tag::class[]
 }
 //end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.layout.xml
index e6cee971cc..d3f19a9c14 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage.layout.xml
@@ -15,7 +15,6 @@
         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">
 			<cpt:domainObject />
@@ -27,15 +26,8 @@
 
 	<bs3:row>
 		<bs3:col span="6">
-			<cpt:fieldSet name="Annotated" id="annotation"/>
-			<cpt:fieldSet name="Variants" id="variants"/>
-			<cpt:fieldSet name="Contributed" id="contributed"/>
-			<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
-			<cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/>
 			<cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
-			<cpt:collection id="children">
-				<cpt:action id="returnsChildren"/>
-			</cpt:collection>
+			<cpt:collection id="objects"/>
 		</bs3:col>
 		<bs3:col span="6">
 			<cpt:fieldSet name="Description" id="description" >
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_mixinPropertyWithMetaAnnotationOverridden.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_mixinPropertyWithMetaAnnotationOverridden.java
deleted file mode 100644
index 776998b5a8..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_mixinPropertyWithMetaAnnotationOverridden.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.Property.hidden;
-
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Where;
-
-import lombok.RequiredArgsConstructor;
-
-//tag::meta-annotation-overridden[]
-@HiddenEverywhereMetaAnnotation             // <.>
-@Property(
-    hidden = Where.NOWHERE                  // <.>
-)
-@PropertyLayout(
-    describedAs =
-        "@HiddenEverywhereMetaAnnotation " +
-        "@Property(hidden = NOWHERE)",
-    fieldSetId = "meta-annotated-overridden", sequence = "2"
-)
-@RequiredArgsConstructor
-public class PropertyHiddenPage_mixinPropertyWithMetaAnnotationOverridden {
-    // ...
-//end::meta-annotation-overridden[]
-
-    private final PropertyHiddenPage page;
-
-    public String prop() {
-        return page.getPropertyHiddenNowhereUsingAnnotation();
-    }
-
-//tag::meta-annotation-overridden[]
-}
-//end::meta-annotation-overridden[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_objects.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_objects.java
new file mode 100644
index 0000000000..93fe4afd95
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_objects.java
@@ -0,0 +1,27 @@
+package demoapp.dom.domain.properties.Property.hidden;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.annotation.Collection;
+import org.apache.causeway.applib.annotation.MemberSupport;
+
+//tag::class[]
+@Collection()
+@RequiredArgsConstructor
+public class PropertyHiddenPage_objects {
+
+    @SuppressWarnings("unused")
+    private final PropertyHiddenPage page;
+
+    @MemberSupport public List<? extends PropertyHidden> coll() {
+        return objectRepository.all();
+    }
+
+    @Inject ValueHolderRepository<String, ? extends PropertyHidden> objectRepository;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_returnsChildren.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenRepository.java
similarity index 59%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_returnsChildren.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenRepository.java
index 282fe967fd..98db0955b3 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_returnsChildren.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenRepository.java
@@ -20,25 +20,7 @@ package demoapp.dom.domain.properties.Property.hidden;
 
 import java.util.List;
 
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.SemanticsOf;
-
-import demoapp.dom.domain.properties.Property.hidden.child.PropertyHiddenChildVm;
-import lombok.RequiredArgsConstructor;
-
-@Action(
-    semantics = SemanticsOf.SAFE
-)
-@RequiredArgsConstructor
-public class PropertyHiddenPage_returnsChildren {
-
-    private final PropertyHiddenPage page;
-
-//tag::meta-annotation[]
-    @MemberSupport public List<PropertyHiddenChildVm> act() {
-        return page.getChildren();
-    }
-//end::meta-annotation[]
+public interface PropertyHiddenRepository {
 
+    List<? extends PropertyHidden> allInstances();
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_mixinPropertyWithMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenSeeding.java
similarity index 58%
rename from examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_mixinPropertyWithMetaAnnotation.java
rename to examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenSeeding.java
index 4b8c8ddc4f..105f7d84e6 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenPage_mixinPropertyWithMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenSeeding.java
@@ -18,30 +18,23 @@
  */
 package demoapp.dom.domain.properties.Property.hidden;
 
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-
-import lombok.RequiredArgsConstructor;
-
-//tag::class[]
-@Property()
-@HiddenEverywhereMetaAnnotation             // <.>
-@PropertyLayout(
-    describedAs =
-        "@HiddenEverywhereMetaAnnotation",
-    fieldSetId = "meta-annotated", sequence = "2"
-)
-@RequiredArgsConstructor
-public class PropertyHiddenPage_mixinPropertyWithMetaAnnotation {
-    // ...
-//end::class[]
-
-    private final PropertyHiddenPage page;
-
-    public String prop() {
-        return page.getPropertyHiddenNowhereUsingAnnotation();
+import demoapp.dom._infra.seed.SeedServiceAbstract;
+import demoapp.dom._infra.values.ValueHolderRepository;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class PropertyHiddenSeeding
+extends SeedServiceAbstract {
+
+    @Inject
+    public PropertyHiddenSeeding(
+            ValueHolderRepository<String, ? extends PropertyHidden> entities) {
+        super(entities);
     }
 
-//tag::class[]
+
+
 }
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm-description.adoc
deleted file mode 100644
index 1f0eee0ec9..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm-description.adoc
+++ /dev/null
@@ -1,52 +0,0 @@
-: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 [...]
-
-This (child) object displays the visibility of variations of the `hidden` element.
-
-
-.Hidden Variants
-[cols="^1m,<2m,2a",options=header,frame="all"]
-|===
-^| Where
-^| This (child) object
-^| Notes
-
-| NOWHERE
-| propertyHiddenNowhere
-| Visible at all times
-
-| EVERYWHERE
-| propertyHiddenEverywhere
-
-| Should not be visible at all.
-
-| ANYWHERE
-| propertyHiddenAnywhere
-| Should not be visible at all +
-(synonym for EVERYWHERE)
-
-| ALL_TABLES
-| propertyHiddenAllTables
-| Visible in the object form, but _not_ visible in the child collection nor in the standalone list returned by the action.
-
-| OBJECT_FORMS
-| propertyHiddenObjectForms
-| Visible in collections, but _not_ in the object's detail.
-
-| STANDALONE_TABLES
-| propertyHiddenStandaloneTables
-| Visible in the object form and collection, but _not_ in the standalone list returned by the action.
-
-| ALL_EXCEPT_ +
-STANDALONE_TABLES
-| propertyHiddenAllExceptStandaloneTables
-| Visible only in the standalone list returned by the action.
-
-| PARENTED_TABLES
-| propertyHiddenParentedTables
-| Visible everywhere _except_ in the collection.
-
-| REFERENCES_PARENT
-| propertyHiddenReferencesParent
-| Visible everywhere _except_ in the collection, where the type of the property is the referencing parent object.
-
-|===
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java
deleted file mode 100644
index 2e2965a371..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.Property.hidden.child;
-
-import javax.inject.Named;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-
-import org.apache.causeway.applib.annotation.DomainObject;
-import org.apache.causeway.applib.annotation.Nature;
-import org.apache.causeway.applib.annotation.ObjectSupport;
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Where;
-
-import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
-import demoapp.dom.domain.properties.Property.hidden.PropertyHiddenPage;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-//tag::class[]
-@XmlRootElement(name = "child")
-@XmlType
-@XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo.PropertyHiddenChildVm")
-@DomainObject(
-        nature=Nature.VIEW_MODEL)
-@NoArgsConstructor
-public class PropertyHiddenChildVm implements HasAsciiDocDescription {
-
-    public PropertyHiddenChildVm(final String value, final PropertyHiddenPage parent) {
-        setPropertyHiddenNowhere(value);
-        setPropertyHiddenEverywhere(value);
-        setPropertyHiddenAnywhere(value);
-
-        setPropertyHiddenAllTables(value);
-        setPropertyHiddenObjectForms(value);
-
-        setPropertyHiddenStandaloneTables(value);
-        setPropertyHiddenAllExceptStandaloneTables(value);
-        setPropertyHiddenParentedTables(value);
-
-        setPropertyHiddenReferencesParent(parent);
-    }
-
-    @ObjectSupport public String title() {
-        return "@Property#hidden (child object)";
-    }
-
-//tag::variants-nowhere[]
-    @Property(
-        hidden = Where.NOWHERE                           // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.NOWHERE)",
-        fieldSetId = "variants", sequence = "1")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenNowhere;
-//end::variants-nowhere[]
-
-//tag::variants-everywhere[]
-    @Property(
-        hidden = Where.EVERYWHERE                        // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.EVERYWHERE)",
-        fieldSetId = "variants", sequence = "2")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenEverywhere;
-//end::variants-everywhere[]
-
-//tag::variants-anywhere[]
-    @Property(
-        hidden = Where.ANYWHERE                        // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.ANYWHERE)",
-        fieldSetId = "variants", sequence = "2.1")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenAnywhere;
-//end::variants-everywhere[]
-
-//tag::variants-all_tables[]
-    @Property(
-        hidden = Where.ALL_TABLES                       // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.ALL_TABLES)",
-        fieldSetId = "variants", sequence = "3")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenAllTables;
-//end::variants-all_tables[]
-
-//tag::variants-object_forms[]
-    @Property(
-        hidden = Where.OBJECT_FORMS                     // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.OBJECT_FORMS)",
-        fieldSetId = "variants", sequence = "4")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenObjectForms;
-//end::variants-all_tables[]
-
-    //tag::variants-standalone_tables[]
-    @Property(
-        hidden = Where.STANDALONE_TABLES            // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.STANDALONE_TABLES)",
-        fieldSetId = "variants", sequence = "5")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenStandaloneTables;
-//end::variants-standalone_tables[]
-
-    //tag::variants-all_except_standalone_tables[]
-    @Property(
-        hidden = Where.ALL_EXCEPT_STANDALONE_TABLES            // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.ALL_EXCEPT_STANDALONE_TABLES)",
-        fieldSetId = "variants", sequence = "6")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenAllExceptStandaloneTables;
-//end::variants-all_except_standalone_tables[]
-
-
-    //tag::variants-parented_tables[]
-    @Property(
-        hidden = Where.PARENTED_TABLES            // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.PARENTED_TABLES)",
-        fieldSetId = "variants", sequence = "7")
-    @XmlElement(required = false)
-    @Getter @Setter
-    private String propertyHiddenParentedTables;
-//end::variants-parented_tables[]
-
-//tag::variants-references_parent[]
-    @Property(
-        hidden = Where.REFERENCES_PARENT            // <.>
-    )
-    @PropertyLayout(
-        describedAs =
-            "@Property(hidden = Where.REFERENCES_PARENT)",
-        fieldSetId = "variants", sequence = "8")
-    @XmlTransient   // to avoid cycles
-    @Getter @Setter
-    private PropertyHiddenPage propertyHiddenReferencesParent;
-//tag::variants-references_parent[]
-
-}
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm_mixinProperty.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm_mixinProperty.java
deleted file mode 100644
index d6e8a530c0..0000000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm_mixinProperty.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom.domain.properties.Property.hidden.child;
-
-import org.apache.causeway.applib.annotation.Property;
-import org.apache.causeway.applib.annotation.PropertyLayout;
-import org.apache.causeway.applib.annotation.Where;
-
-import lombok.RequiredArgsConstructor;
-
-//tag::class[]
-@Property()
-@PropertyLayout(
-    hidden = Where.ALL_TABLES                   // <.>
-    , describedAs =
-        "@Property(hidden = ALL_TABLES)",
-    fieldSetId = "contributed", sequence = "1"
-)
-@RequiredArgsConstructor
-public class PropertyHiddenChildVm_mixinProperty {
-    // ...
-//end::class[]
-
-    private final PropertyHiddenChildVm propertyHiddenChildVm;
-
-    public String prop() {
-        return propertyHiddenChildVm.getPropertyHiddenNowhere();
-    }
-
-//tag::class[]
-}
-//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpa-description.adoc
new file mode 100644
index 0000000000..8ce21fa386
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpa-description.adoc
@@ -0,0 +1,3 @@
+: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 [...]
+
+include::../PropertyHidden-description.adoc[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpa.java
new file mode 100644
index 0000000000..c4be82a512
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpa.java
@@ -0,0 +1,81 @@
+/*
+ *  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.properties.Property.hidden.jpa;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+import demoapp.dom._infra.values.ValueHolder;
+import demoapp.dom.domain.properties.Property.hidden.PropertyHidden;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.inject.Named;
+import javax.persistence.*;
+
+import org.apache.causeway.applib.annotation.*;
+import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;
+import org.springframework.context.annotation.Profile;
+
+@Profile("demo-jpa")
+@Entity
+@Table(
+    schema = "demo",
+    name = "PropertyHiddenJpa"
+)
+@EntityListeners(CausewayEntityListener.class)
+@Named("demo.PropertyHiddenJpa")
+@NoArgsConstructor
+//tag::class[]
+// ...
+@DomainObject(nature = Nature.ENTITY)
+public class PropertyHiddenJpa extends PropertyHidden {
+    // ...
+//end::class[]
+
+    public PropertyHiddenJpa(String value) {
+        setName(value);
+        setNameHiddenAllTables(value);
+        setNameHiddenEverywhere(value);
+        setNameHiddenObjectForms(value);
+    }
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Property()
+    @Getter @Setter
+    private String name;
+
+    @Property(hidden = Where.ALL_TABLES)
+    @Getter @Setter
+    private String nameHiddenAllTables;
+
+    @Property(hidden = Where.EVERYWHERE)
+    @Getter @Setter
+    private String nameHiddenEverywhere;
+
+    @Property(hidden = Where.OBJECT_FORMS)
+    @Getter @Setter
+    private String nameHiddenObjectForms;
+
+
+//tag::class[]
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpaEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpaEntities.java
new file mode 100644
index 0000000000..ae5a610b7d
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/jpa/PropertyHiddenJpaEntities.java
@@ -0,0 +1,55 @@
+/*
+ *  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.properties.Property.hidden.jpa;
+
+import demoapp.dom._infra.values.ValueHolderRepository;
+import demoapp.dom.domain.properties.Property.hidden.PropertyHidden;
+import demoapp.dom.domain.properties.Property.hidden.PropertyHiddenRepository;
+
+import java.util.List;
+
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
+
+@Profile("demo-jpa")
+@Service
+public class PropertyHiddenJpaEntities
+extends ValueHolderRepository<String, PropertyHiddenJpa> implements PropertyHiddenRepository {
+
+    protected PropertyHiddenJpaEntities() {
+        super(PropertyHiddenJpa.class);
+    }
+
+    @Override
+    protected PropertyHiddenJpa newDetachedEntity(String value) {
+        return new PropertyHiddenJpa(value);
+    }
+
+    @Override
+    public List<? extends PropertyHidden> allInstances() {
+        return all();
+    }
+
+    public List<? extends PropertyHidden> allMatches(final String s) {
+        return all();
+    }
+    public List<? extends PropertyHidden> allMatches() {
+        return all();
+    }
+}