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

git commit: ISIS-611, ISIS-612: disabled and hidden facets dynamically.

Updated Branches:
  refs/heads/master f0a36b8fb -> 5e5b07c46


ISIS-611, ISIS-612: disabled and hidden facets dynamically.

In addition, updated the LayoutMetadataReaderForJson to correctly export
json for these two tickets and also for ISIS-601, ISIS-602,
ISIS-603, ISIS-604, ISIS-605, ISIS-606, ISIS-607.


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

Branch: refs/heads/master
Commit: 5e5b07c4691cbd651023c6ed8b7b756bc8370e09
Parents: f0a36b8
Author: Dan Haywood <da...@apache.org>
Authored: Thu Nov 28 13:45:33 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Nov 28 13:45:33 2013 +0000

----------------------------------------------------------------------
 .../legacy/MemberHiddenTest.java                |  20 +--
 .../layoutmetadata/DisabledFacetRepr.java       |  26 ++++
 .../layoutmetadata/HiddenFacetRepr.java         |  26 ++++
 .../metamodel/layoutmetadata/MemberRepr.java    |   2 +
 .../json/LayoutMetadataReaderFromJson.java      | 156 +++++++++++++++++--
 .../members/disabled/DisabledFacetImpl.java     |   7 +
 .../DisabledAnnotationFacetFactory.java         |  46 ------
 .../annotation/DisabledFacetFactory.java        |  75 +++++++++
 .../annotation/DisabledFacetFromProperties.java |  57 +++++++
 .../HiddenAnnotationForMemberFacetFactory.java  |  46 ------
 .../HiddenFacetForMemberAnnotation.java         |  33 ----
 .../HiddenFacetOnMemberAnnotation.java          |  33 ++++
 .../HiddenFacetOnMemberFromProperties.java      |  53 +++++++
 .../annotation/HiddenForMemberFacetFactory.java |  74 +++++++++
 .../RenderOrResolveAnnotationFacetFactory.java  |  85 ----------
 .../resolve/RenderOrResolveFacetFactory.java    |  83 ++++++++++
 .../dflt/ProgrammingModelFacetsJava5.java       |  12 +-
 .../DisabledAnnotationFacetFactoryTest.java     |   6 +-
 .../HiddenAnnotationFacetFactoryTest.java       |   6 +-
 ...onFacetFactoryTest_withRenderAnnotation.java |   4 +-
 ...nFacetFactoryTest_withResolveAnnotation.java |   4 +-
 .../json/ExampleDomainObject.layout.json        |  13 +-
 .../json/ExampleDomainObject.layout.properties  |   4 +
 .../dom/src/main/java/dom/todo/ToDoItem.java    |   8 -
 .../src/main/java/dom/todo/ToDoItem.layout.json |  31 +++-
 25 files changed, 644 insertions(+), 266 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/MemberHiddenTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/MemberHiddenTest.java b/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/MemberHiddenTest.java
index b0589b2..5753c10 100644
--- a/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/MemberHiddenTest.java
+++ b/core/integtestsupport/src/test/java/org/apache/isis/core/integtestsupport/legacy/MemberHiddenTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.services.wrapper.HiddenException;
 import org.apache.isis.core.integtestsupport.legacy.sample.domain.Country;
-import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenFacetForMemberAnnotation;
+import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenFacetOnMemberAnnotation;
 import org.apache.isis.core.progmodel.facets.members.hidden.forsession.HideForSessionFacetViaMethod;
 import org.apache.isis.core.progmodel.facets.members.hidden.method.HideForContextFacetViaMethod;
 
@@ -162,7 +162,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.setAlwaysHiddenValue("Dick");
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Value"));
         }
     }
@@ -173,7 +173,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.setAlwaysHiddenValue(null);
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Value"));
         }
     }
@@ -184,7 +184,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.getAlwaysHiddenValue();
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Value"));
         }
     }
@@ -197,7 +197,7 @@ public class MemberHiddenTest extends AbstractTest {
                 custJsWO.setAlwaysHiddenAssociation(value);
                 fail("Should have thrown exception");
             } catch (final HiddenException ex) {
-                assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+                assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
                 assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Association"));
             }
         }
@@ -209,7 +209,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.getAlwaysHiddenAssociation();
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Association"));
         }
     }
@@ -220,7 +220,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.addToAlwaysHiddenCollection(countryUsaDO);
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Collection"));
         }
     }
@@ -232,7 +232,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.removeFromAlwaysHiddenCollection(countryUsaDO);
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Collection"));
         }
     }
@@ -243,7 +243,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.getAlwaysHiddenCollection();
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Collection"));
         }
     }
@@ -254,7 +254,7 @@ public class MemberHiddenTest extends AbstractTest {
             custJsWO.alwaysHiddenAction();
             fail("Should have thrown exception");
         } catch (final HiddenException ex) {
-            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetForMemberAnnotation.class));
+            assertThat(ex.getAdvisorClass(), classEqualTo(HiddenFacetOnMemberAnnotation.class));
             assertThat(ex.getIdentifier().getMemberNaturalName(), equalTo("Always Hidden Action"));
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/DisabledFacetRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/DisabledFacetRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/DisabledFacetRepr.java
new file mode 100644
index 0000000..891817f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/DisabledFacetRepr.java
@@ -0,0 +1,26 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.core.metamodel.layoutmetadata;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+
+public class DisabledFacetRepr {
+    public When when;
+    public Where where;
+    public String reason;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/HiddenFacetRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/HiddenFacetRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/HiddenFacetRepr.java
new file mode 100644
index 0000000..5e4058b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/HiddenFacetRepr.java
@@ -0,0 +1,26 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.core.metamodel.layoutmetadata;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+
+public class HiddenFacetRepr {
+    public When when;
+    public Where where;
+    public String reason;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/MemberRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/MemberRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/MemberRepr.java
index 857d778..b706473 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/MemberRepr.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/MemberRepr.java
@@ -29,6 +29,8 @@ public class MemberRepr {
     public Map<String,ActionRepr> actions;
     public PagedFacetRepr paged;
     public RenderFacetRepr render;
+    public HiddenFacetRepr hidden;
+    public DisabledFacetRepr disabled;
     public NamedFacetRepr named;
     public DescribedAsFacetRepr describedAs;
     public CssClassFacetRepr cssClass;

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index 30bde7a..c51b4bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -36,16 +37,29 @@ import com.google.gson.GsonBuilder;
 import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
 import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.annotation.Render.Type;
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.applib.services.viewmodelsupport.ViewModelSupport.Memento;
 import org.apache.isis.core.commons.lang.ClassExtensions;
+import org.apache.isis.core.metamodel.facets.describedas.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.facets.members.resolve.RenderFacet;
+import org.apache.isis.core.metamodel.facets.multiline.MultiLineFacet;
+import org.apache.isis.core.metamodel.facets.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
+import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
+import org.apache.isis.core.metamodel.facets.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
 import org.apache.isis.core.metamodel.layoutmetadata.ActionRepr;
 import org.apache.isis.core.metamodel.layoutmetadata.ColumnRepr;
 import org.apache.isis.core.metamodel.layoutmetadata.CssClassFacetRepr;
 import org.apache.isis.core.metamodel.layoutmetadata.DescribedAsFacetRepr;
+import org.apache.isis.core.metamodel.layoutmetadata.DisabledFacetRepr;
+import org.apache.isis.core.metamodel.layoutmetadata.HiddenFacetRepr;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadata;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
 import org.apache.isis.core.metamodel.layoutmetadata.MemberGroupRepr;
@@ -63,6 +77,11 @@ import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacet;
+import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacetImpl;
+import org.apache.isis.core.progmodel.facets.members.disabled.annotation.DisabledFacetAnnotation;
+import org.apache.isis.core.progmodel.facets.members.disabled.annotation.DisabledFacetFromProperties;
 
 public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
 
@@ -169,6 +188,27 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
             if(paged != null) {
                 props.setProperty("member." + memberName + ".paged.value", ""+paged.value);
             }
+            final DisabledFacetRepr disabled = memberRepr.disabled;
+            if(disabled != null) {
+                // same default as in Disabled.when()
+                final When disabledWhen = disabled.when!=null?disabled.when: When.ALWAYS;
+                props.setProperty("member." + memberName + ".disabled.when", disabledWhen.toString());
+                // same default as in Disabled.where()
+                final Where disabledWhere = disabled.where!=null?disabled.where: Where.ANYWHERE;
+                props.setProperty("member." + memberName + ".disabled.where", disabledWhere.toString());
+                // same default as in Disabled.reason()
+                final String disabledReason = disabled.reason!=null?disabled.reason: "";
+                props.setProperty("member." + memberName + ".disabled.reason", disabledReason);
+            }
+            final HiddenFacetRepr hidden = memberRepr.hidden;
+            if(hidden != null) {
+                // same default as in Hidden.when()
+                final When hiddenWhen = hidden.when!=null?hidden.when: When.ALWAYS;
+                props.setProperty("member." + memberName + ".hidden.when", hiddenWhen.toString());
+                // same default as in Hidden.where()
+                final Where hiddenWhere = hidden.where!=null?hidden.where: Where.ANYWHERE;
+                props.setProperty("member." + memberName + ".hidden.where", hiddenWhere.toString());
+            }
             final RenderFacetRepr render = memberRepr.render;
             if(render != null) {
                 // same default as in Render.Type.value()
@@ -308,7 +348,28 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
     }
 
     private static ActionRepr newActionRepr(ObjectSpecification objectSpec, ObjectAction action) {
-        return new ActionRepr();
+        ActionRepr actionRepr = new ActionRepr();
+        
+        CssClassFacet cssClassFacet = action.getFacet(CssClassFacet.class);
+        if(cssClassFacet != null && !cssClassFacet.isNoop()) {
+            CssClassFacetRepr cssClassFacetRepr = new CssClassFacetRepr();
+            cssClassFacetRepr.value = cssClassFacet.value();
+            actionRepr.cssClass = cssClassFacetRepr;
+        }
+        DescribedAsFacet describedAsFacet = action.getFacet(DescribedAsFacet.class);
+        if(describedAsFacet != null && !describedAsFacet.isNoop() && !Strings.isNullOrEmpty(describedAsFacet.value())) {
+            DescribedAsFacetRepr describedAsFacetRepr = new DescribedAsFacetRepr();
+            describedAsFacetRepr.value = describedAsFacet.value();
+            actionRepr.describedAs = describedAsFacetRepr;
+        }
+        NamedFacet namedFacet = action.getFacet(NamedFacet.class);
+        if(namedFacet != null && !namedFacet.isNoop()) {
+            NamedFacetRepr namedFacetRepr = new NamedFacetRepr();
+            namedFacetRepr.value = namedFacet.value();
+            actionRepr.named = namedFacetRepr;
+        }
+        
+        return actionRepr;
     }
 
     private static void updateCollectionColumnRepr(ObjectSpecification objectSpec, ColumnRepr columnRepr, Set<String> actionIdsOfAssociations) {
@@ -323,7 +384,68 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
 
     private static MemberRepr newMemberRepr(ObjectSpecification objectSpec, ObjectAssociation assoc, Set<String> actionIdsForAssociations) {
         final MemberRepr memberRepr = new MemberRepr();
-        
+
+        CssClassFacet cssClassFacet = assoc.getFacet(CssClassFacet.class);
+        if(cssClassFacet != null && !cssClassFacet.isNoop()) {
+            CssClassFacetRepr cssClassFacetRepr = new CssClassFacetRepr();
+            cssClassFacetRepr.value = cssClassFacet.value();
+            memberRepr.cssClass = cssClassFacetRepr;
+        }
+        DescribedAsFacet describedAsFacet = assoc.getFacet(DescribedAsFacet.class);
+        if(describedAsFacet != null && !describedAsFacet.isNoop() && !Strings.isNullOrEmpty(describedAsFacet.value())) {
+            DescribedAsFacetRepr describedAsFacetRepr = new DescribedAsFacetRepr();
+            describedAsFacetRepr.value = describedAsFacet.value();
+            memberRepr.describedAs = describedAsFacetRepr;
+        }
+        NamedFacet namedFacet = assoc.getFacet(NamedFacet.class);
+        if(namedFacet != null && !namedFacet.isNoop()) {
+            NamedFacetRepr namedFacetRepr = new NamedFacetRepr();
+            namedFacetRepr.value = namedFacet.value();
+            memberRepr.named = namedFacetRepr;
+        }
+        DisabledFacet disabledFacet = assoc.getFacet(DisabledFacet.class);
+        if(disabledFacet != null && !disabledFacet.isNoop()) {
+            DisabledFacetRepr disabledFacetRepr = new DisabledFacetRepr();
+            if(disabledFacet instanceof DisabledFacetImpl) {
+                DisabledFacetImpl disabledFacetImpl = (DisabledFacetImpl) disabledFacet;
+                disabledFacetRepr.reason = Strings.emptyToNull(disabledFacetImpl.getReason());
+            }
+            disabledFacetRepr.when = whenAlwaysToNull(disabledFacet.when());
+            disabledFacetRepr.where = whereAnywhereToNull(disabledFacet.where());
+            memberRepr.disabled = disabledFacetRepr;
+        }
+        HiddenFacet hiddenFacet = assoc.getFacet(HiddenFacet.class);
+        if(hiddenFacet != null && !hiddenFacet.isNoop()) {
+            HiddenFacetRepr hiddenFacetRepr = new HiddenFacetRepr();
+            hiddenFacetRepr.when = whenAlwaysToNull(hiddenFacet.when());
+            hiddenFacetRepr.where = whereAnywhereToNull(hiddenFacet.where());
+            memberRepr.hidden = hiddenFacetRepr;
+        }
+        MultiLineFacet multiLineFacet = assoc.getFacet(MultiLineFacet.class);
+        if(multiLineFacet != null && !multiLineFacet.isNoop()) {
+            MultiLineFacetRepr multiLineFacetRepr = new MultiLineFacetRepr();
+            multiLineFacetRepr.numberOfLines = multiLineFacet.numberOfLines();
+            memberRepr.multiLine = multiLineFacetRepr;
+        }
+        PagedFacet pagedFacet = assoc.getFacet(PagedFacet.class);
+        if(pagedFacet != null && !pagedFacet.isNoop()) {
+            PagedFacetRepr pagedFacetRepr = new PagedFacetRepr();
+            pagedFacetRepr.value = pagedFacet.value();
+            memberRepr.paged = pagedFacetRepr;
+        }
+        RenderFacet renderFacet = assoc.getFacet(RenderFacet.class);
+        if(renderFacet != null && !renderFacet.isNoop()) {
+            RenderFacetRepr renderFacetRepr = new RenderFacetRepr();
+            renderFacetRepr.value = renderFacet.value();
+            memberRepr.render = renderFacetRepr;
+        }
+        TypicalLengthFacet typicalLengthFacet = assoc.getFacet(TypicalLengthFacet.class);
+        if(typicalLengthFacet != null && !typicalLengthFacet.isNoop()) {
+            TypicalLengthFacetRepr typicalLengthFacetRepr = new TypicalLengthFacetRepr();
+            typicalLengthFacetRepr.value = typicalLengthFacet.value();
+            memberRepr.typicalLength = typicalLengthFacetRepr;
+        }
+
         final List<ObjectAction> actions = objectSpec.getObjectActions(
                 ActionType.USER, Contributed.INCLUDED, ObjectActions.memberOrderOf(assoc));
         if(!actions.isEmpty()) {
@@ -340,6 +462,14 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
         return memberRepr;
     }
 
+    private static Where whereAnywhereToNull(Where where) {
+        return where != Where.ANYWHERE? where: null;
+    }
+
+    private static When whenAlwaysToNull(When when) {
+        return when != When.ALWAYS? when: null;
+    }
+
     private static void sortByMemberOrderFacet(final List<ObjectAction> actions) {
         Collections.sort(actions, new Comparator<ObjectAction>() {
 
@@ -359,32 +489,24 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
     }
 
     
-    @SuppressWarnings({ "unchecked", "deprecation" })
     private static List<ObjectAssociation> propertiesOf(final ObjectSpecification objSpec) {
-        return objSpec.getAssociations(Contributed.EXCLUDED, 
-                Filters.and(ObjectAssociation.Filters.PROPERTIES, 
-                            ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES));
+        return objSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES);
     }
-    @SuppressWarnings({ "unchecked", "deprecation" })
     private static List<ObjectAssociation> collectionsOf(final ObjectSpecification objSpec) {
-        return objSpec.getAssociations(Contributed.EXCLUDED, 
-                Filters.and(ObjectAssociation.Filters.COLLECTIONS, 
-                            ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES));
+        return objSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.COLLECTIONS);
     }
     private static List<ObjectAction> actionsOf(final ObjectSpecification objSpec, final Set<String> excludedActionIds) {
-        return objSpec.getObjectActions(ActionType.ALL, Contributed.INCLUDED, staticallyVisibleExcluding(excludedActionIds));
+        return objSpec.getObjectActions(ActionType.ALL, Contributed.INCLUDED, excluding(excludedActionIds));
     }
 
-    @SuppressWarnings({ "unchecked", "deprecation" })
-    private static Filter<ObjectAction> staticallyVisibleExcluding(final Set<String> excludedActionIds) {
-        return Filters.and(
-                ObjectAction.Filters.VISIBLE_AT_LEAST_SOMETIMES, 
-                new Filter<ObjectAction>(){
+    @SuppressWarnings({ "deprecation" })
+    private static Filter<ObjectAction> excluding(final Set<String> excludedActionIds) {
+        return new Filter<ObjectAction>(){
                     @Override
                     public boolean accept(ObjectAction t) {
                         return !excludedActionIds.contains(t.getId());
                     }
-                });
+                };
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/DisabledFacetImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/DisabledFacetImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/DisabledFacetImpl.java
index 225aee1..a2b8ecc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/DisabledFacetImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/DisabledFacetImpl.java
@@ -64,4 +64,11 @@ public class DisabledFacetImpl extends DisabledFacetAbstract {
         return !Strings.isNullOrEmpty(reason) ? reason : defaultReason;
     }
 
+    /**
+     * Not API... the reason as defined in subclass
+     */
+    public String getReason() {
+        return reason;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledAnnotationFacetFactory.java
deleted file mode 100644
index ff13a12..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledAnnotationFacetFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.progmodel.facets.members.disabled.annotation;
-
-import org.apache.isis.applib.annotation.Disabled;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacet;
-
-public class DisabledAnnotationFacetFactory extends FacetFactoryAbstract {
-
-    public DisabledAnnotationFacetFactory() {
-        super(FeatureType.MEMBERS);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        final Disabled annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Disabled.class);
-        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
-    }
-
-    private DisabledFacet create(final Disabled annotation, final FacetHolder holder) {
-        return annotation == null ? null : new DisabledFacetAnnotation(annotation.when(), annotation.where(), annotation.reason(), holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFactory.java
new file mode 100644
index 0000000..5eb550f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFactory.java
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.members.disabled.annotation;
+
+import java.util.Properties;
+
+import org.apache.isis.applib.annotation.Disabled;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacet;
+import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenFacetOnMemberFromProperties;
+
+public class DisabledFacetFactory extends FacetFactoryAbstract 
+        implements ContributeeMemberFacetFactory {
+
+    public DisabledFacetFactory() {
+        super(FeatureType.MEMBERS);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        DisabledFacet disabledFacet = createFromMetadataPropertiesIfPossible(processMethodContext);
+        if(disabledFacet == null) {
+            disabledFacet = createFromAnnotationIfPossible(processMethodContext);
+        }
+        // no-op if null
+        FacetUtil.addFacet(disabledFacet);
+    }
+
+    @Override
+    public void process(ProcessContributeeMemberContext processMemberContext) {
+        DisabledFacet disabledFacet = createFromMetadataPropertiesIfPossible(processMemberContext);
+        // no-op if null
+        FacetUtil.addFacet(disabledFacet);
+    }
+
+    private static DisabledFacet createFromAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
+        final Disabled annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Disabled.class);
+        return annotation != null 
+                ? new DisabledFacetAnnotation(annotation.when(), annotation.where(), annotation.reason(), processMethodContext.getFacetHolder()) 
+                : null;
+    }
+
+    private static DisabledFacet createFromMetadataPropertiesIfPossible(
+            final ProcessContextWithMetadataProperties<? extends FacetHolder> pcwmp) {
+        
+        final FacetHolder holder = pcwmp.getFacetHolder();
+        
+        final Properties properties = pcwmp.metadataProperties("disabled");
+        return properties != null ? new DisabledFacetFromProperties(properties, holder) : null;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFromProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFromProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFromProperties.java
new file mode 100644
index 0000000..0028628
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/disabled/annotation/DisabledFacetFromProperties.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.members.disabled.annotation;
+
+import java.util.Properties;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacetImpl;
+
+public class DisabledFacetFromProperties extends DisabledFacetImpl {
+
+    public DisabledFacetFromProperties(final When when, Where where, String reason, final FacetHolder holder) {
+        super(when, where, reason, holder);
+    }
+
+    public DisabledFacetFromProperties(Properties properties, FacetHolder holder) {
+        super(disabledWhenFrom(properties), disabledWhereFrom(properties), disabledReasonFrom(properties), holder);
+    }
+
+    private static When disabledWhenFrom(Properties properties) {
+        String value = properties.getProperty("when");
+        // same default as in Disabled.when()
+        return value != null? When.valueOf(value): When.ALWAYS;
+    }
+
+    private static Where disabledWhereFrom(Properties properties) {
+        String value = properties.getProperty("where");
+        // same default as in Disabled.where()
+        return value != null? Where.valueOf(value): Where.ANYWHERE;
+    }
+    
+    private static String disabledReasonFrom(Properties properties) {
+        String value = properties.getProperty("reason");
+        // same default as in Disabled.reason()
+        return value != null? value: "";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenAnnotationForMemberFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenAnnotationForMemberFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenAnnotationForMemberFacetFactory.java
deleted file mode 100644
index a9a5811..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenAnnotationForMemberFacetFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.progmodel.facets.members.hidden.annotation;
-
-import org.apache.isis.applib.annotation.Hidden;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
-
-public class HiddenAnnotationForMemberFacetFactory extends FacetFactoryAbstract {
-
-    public HiddenAnnotationForMemberFacetFactory() {
-        super(FeatureType.MEMBERS);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        final Hidden annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Hidden.class);
-        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
-    }
-
-    private static HiddenFacet create(final Hidden annotation, final FacetHolder holder) {
-        return annotation == null ? null : new HiddenFacetForMemberAnnotation(annotation.when(), annotation.where(), holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetForMemberAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetForMemberAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetForMemberAnnotation.java
deleted file mode 100644
index dfe5553..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetForMemberAnnotation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.progmodel.facets.members.hidden.annotation;
-
-import org.apache.isis.applib.annotation.When;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.progmodel.facets.members.hidden.HiddenFacetImpl;
-
-public class HiddenFacetForMemberAnnotation extends HiddenFacetImpl {
-
-    public HiddenFacetForMemberAnnotation(final When when, Where where, final FacetHolder holder) {
-        super(when, where, holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberAnnotation.java
new file mode 100644
index 0000000..fc39306
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberAnnotation.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.members.hidden.annotation;
+
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.progmodel.facets.members.hidden.HiddenFacetImpl;
+
+public class HiddenFacetOnMemberAnnotation extends HiddenFacetImpl {
+
+    public HiddenFacetOnMemberAnnotation(final When when, Where where, final FacetHolder holder) {
+        super(when, where, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberFromProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberFromProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberFromProperties.java
new file mode 100644
index 0000000..780a363
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenFacetOnMemberFromProperties.java
@@ -0,0 +1,53 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.members.hidden.annotation;
+
+import java.util.Properties;
+
+import org.apache.isis.applib.annotation.Render;
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.annotation.Render.Type;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.progmodel.facets.members.hidden.HiddenFacetImpl;
+
+public class HiddenFacetOnMemberFromProperties extends HiddenFacetImpl {
+
+    public HiddenFacetOnMemberFromProperties(final When when, Where where, final FacetHolder holder) {
+        super(when, where, holder);
+    }
+
+    public HiddenFacetOnMemberFromProperties(Properties properties, FacetHolder holder) {
+        super(hiddenWhenFrom(properties), hiddenWhereFrom(properties), holder);
+    }
+
+    private static When hiddenWhenFrom(Properties properties) {
+        String value = properties.getProperty("when");
+        // same default as in Hidden.when()
+        return value != null? When.valueOf(value): When.ALWAYS;
+    }
+
+    private static Where hiddenWhereFrom(Properties properties) {
+        String value = properties.getProperty("where");
+        // same default as in Hidden.where()
+        return value != null? Where.valueOf(value): Where.ANYWHERE;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenForMemberFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenForMemberFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenForMemberFacetFactory.java
new file mode 100644
index 0000000..2c5bd7d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/hidden/annotation/HiddenForMemberFacetFactory.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.members.hidden.annotation;
+
+import java.util.Properties;
+
+import org.apache.isis.applib.annotation.Hidden;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
+
+public class HiddenForMemberFacetFactory extends FacetFactoryAbstract 
+        implements ContributeeMemberFacetFactory {
+
+    public HiddenForMemberFacetFactory() {
+        super(FeatureType.MEMBERS);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        HiddenFacet hiddenFacet = createFromMetadataPropertiesIfPossible(processMethodContext);
+        if(hiddenFacet == null) {
+            hiddenFacet = createFromAnnotationIfPossible(processMethodContext);
+        }
+        // no-op if null
+        FacetUtil.addFacet(hiddenFacet);
+    }
+
+    @Override
+    public void process(ProcessContributeeMemberContext processMemberContext) {
+        HiddenFacet hiddenFacet = createFromMetadataPropertiesIfPossible(processMemberContext);
+        // no-op if null
+        FacetUtil.addFacet(hiddenFacet);
+    }
+    
+    private static HiddenFacet createFromAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
+        final Hidden hiddenAnnotation = Annotations.getAnnotation(processMethodContext.getMethod(), Hidden.class);
+        return hiddenAnnotation != null 
+                ? new HiddenFacetOnMemberAnnotation(hiddenAnnotation.when(), hiddenAnnotation.where(), processMethodContext.getFacetHolder()) 
+                : null;
+    }
+
+    private static HiddenFacet createFromMetadataPropertiesIfPossible(
+            final ProcessContextWithMetadataProperties<? extends FacetHolder> pcwmp) {
+        
+        final FacetHolder holder = pcwmp.getFacetHolder();
+        
+        final Properties properties = pcwmp.metadataProperties("hidden");
+        return properties != null ? new HiddenFacetOnMemberFromProperties(properties, holder) : null;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactory.java
deleted file mode 100644
index 7329dfe..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.progmodel.facets.members.resolve;
-
-import java.util.Properties;
-
-import org.apache.isis.applib.annotation.Render;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.members.resolve.RenderFacet;
-
-public class RenderOrResolveAnnotationFacetFactory extends FacetFactoryAbstract 
-        implements ContributeeMemberFacetFactory {
-
-    public RenderOrResolveAnnotationFacetFactory() {
-        super(FeatureType.MEMBERS);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        
-        RenderFacet renderFacet = createFromMetadataPropertiesIfPossible(processMethodContext);
-        if(renderFacet == null) {
-            renderFacet = createFromRenderAnnotationIfPossible(processMethodContext);
-        }
-        if(renderFacet == null) {
-            renderFacet = createFromResolveAnnotationIfPossible(processMethodContext);
-        }
-
-        // no-op if null
-        FacetUtil.addFacet(renderFacet);
-    }
-
-    @Override
-    public void process(ProcessContributeeMemberContext processMemberContext) {
-        RenderFacet renderFacet = createFromMetadataPropertiesIfPossible(processMemberContext);
-        // no-op if null
-        FacetUtil.addFacet(renderFacet);
-    }
-
-    private static RenderFacet createFromMetadataPropertiesIfPossible(
-            final ProcessContextWithMetadataProperties<? extends FacetHolder> pcwmp) {
-        
-        final FacetHolder holder = pcwmp.getFacetHolder();
-        
-        final Properties properties = pcwmp.metadataProperties("render");
-        return properties != null ? new RenderFacetProperties(properties, holder) : null;
-    }
-
-    private static RenderFacet createFromRenderAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
-        RenderFacet renderFacet;
-        final Render renderAnnotation = Annotations.getAnnotation(processMethodContext.getMethod(), Render.class);
-        renderFacet = renderAnnotation == null ? null : new RenderFacetAnnotation(processMethodContext.getFacetHolder(), renderAnnotation.value());
-        return renderFacet;
-    }
-
-    // @Render was originally called @Resolve, so look for that annotation instead.
-    @SuppressWarnings("deprecation")
-    private static RenderFacet createFromResolveAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
-        final org.apache.isis.applib.annotation.Resolve resolveAnnotation = 
-        Annotations.getAnnotation(processMethodContext.getMethod(), org.apache.isis.applib.annotation.Resolve.class);
-        return resolveAnnotation == null ? null : new RenderFacetViaResolveAnnotation(processMethodContext.getFacetHolder(), resolveAnnotation.value());
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveFacetFactory.java
new file mode 100644
index 0000000..ffbea4b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveFacetFactory.java
@@ -0,0 +1,83 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.members.resolve;
+
+import java.util.Properties;
+
+import org.apache.isis.applib.annotation.Render;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.members.resolve.RenderFacet;
+
+public class RenderOrResolveFacetFactory extends FacetFactoryAbstract 
+        implements ContributeeMemberFacetFactory {
+
+    public RenderOrResolveFacetFactory() {
+        super(FeatureType.MEMBERS);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        
+        RenderFacet renderFacet = createFromMetadataPropertiesIfPossible(processMethodContext);
+        if(renderFacet == null) {
+            renderFacet = createFromRenderAnnotationIfPossible(processMethodContext);
+        }
+        if(renderFacet == null) {
+            renderFacet = createFromResolveAnnotationIfPossible(processMethodContext);
+        }
+
+        // no-op if null
+        FacetUtil.addFacet(renderFacet);
+    }
+
+    @Override
+    public void process(ProcessContributeeMemberContext processMemberContext) {
+        RenderFacet renderFacet = createFromMetadataPropertiesIfPossible(processMemberContext);
+        // no-op if null
+        FacetUtil.addFacet(renderFacet);
+    }
+
+    private static RenderFacet createFromMetadataPropertiesIfPossible(
+            final ProcessContextWithMetadataProperties<? extends FacetHolder> pcwmp) {
+        
+        final FacetHolder holder = pcwmp.getFacetHolder();
+        
+        final Properties properties = pcwmp.metadataProperties("render");
+        return properties != null ? new RenderFacetProperties(properties, holder) : null;
+    }
+
+    private static RenderFacet createFromRenderAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
+        final Render renderAnnotation = Annotations.getAnnotation(processMethodContext.getMethod(), Render.class);
+        return renderAnnotation == null ? null : new RenderFacetAnnotation(processMethodContext.getFacetHolder(), renderAnnotation.value());
+    }
+
+    // @Render was originally called @Resolve, so look for that annotation instead.
+    @SuppressWarnings("deprecation")
+    private static RenderFacet createFromResolveAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
+        final org.apache.isis.applib.annotation.Resolve resolveAnnotation = 
+        Annotations.getAnnotation(processMethodContext.getMethod(), org.apache.isis.applib.annotation.Resolve.class);
+        return resolveAnnotation == null ? null : new RenderFacetViaResolveAnnotation(processMethodContext.getFacetHolder(), resolveAnnotation.value());
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index b830aca..35395f4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -52,18 +52,18 @@ import org.apache.isis.core.progmodel.facets.fallback.FallbackFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.cssclass.CssClassOnMemberFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.describedas.annotation.DescribedAsOnMemberFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.describedas.staticmethod.DescribedAsFacetViaDescriptionMethodFacetFactory;
-import org.apache.isis.core.progmodel.facets.members.disabled.annotation.DisabledAnnotationFacetFactory;
+import org.apache.isis.core.progmodel.facets.members.disabled.annotation.DisabledFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.disabled.forsession.DisabledFacetViaDisableForSessionMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.disabled.method.DisabledFacetViaDisableMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.disabled.staticmethod.DisabledFacetViaProtectMethodFacetFactory;
-import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenAnnotationForMemberFacetFactory;
+import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenForMemberFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.hidden.forsession.HiddenFacetViaHideForSessionMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.hidden.method.HiddenFacetViaHideMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.hidden.staticmethod.HiddenFacetViaAlwaysHideMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.named.annotation.NamedOnMemberFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.named.staticmethod.NamedFacetViaNameMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.members.order.MemberOrderFacetFactory;
-import org.apache.isis.core.progmodel.facets.members.resolve.RenderOrResolveAnnotationFacetFactory;
+import org.apache.isis.core.progmodel.facets.members.resolve.RenderOrResolveFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.aggregated.annotation.AggregatedAnnotationFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.autocomplete.annotation.AutoCompleteAnnotationFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.bookmarkable.annotation.BookmarkableAnnotationFacetFactory;
@@ -289,7 +289,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(HiddenFacetViaHideForSessionMethodFacetFactory.class);
         addFactory(HiddenFacetViaAlwaysHideMethodFacetFactory.class);
         addFactory(HiddenFacetViaHideMethodFacetFactory.class);
-        addFactory(RenderOrResolveAnnotationFacetFactory.class);
+        addFactory(RenderOrResolveFacetFactory.class);
 
         // objects
         addFactory(ObjectSpecIdAnnotationFacetFactory.class);
@@ -330,7 +330,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(DescribedAsOnMemberFacetFactory.class);
         addFactory(DescribedAsAnnotationOnParameterFacetFactory.class);
 
-        addFactory(DisabledAnnotationFacetFactory.class);
+        addFactory(DisabledFacetFactory.class);
         addFactory(EncodableAnnotationFacetFactory.class);
         addFactory(ExplorationAnnotationFacetFactory.class);
         addFactory(PrototypeAnnotationFacetFactory.class);
@@ -341,7 +341,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
 
         addFactory(HiddenAnnotationForTypeFacetFactory.class);
         // must come after the TitleAnnotationFacetFactory, because can act as an override
-        addFactory(HiddenAnnotationForMemberFacetFactory.class);
+        addFactory(HiddenForMemberFacetFactory.class);
         addFactory(CssClassAnnotationForTypeFacetFactory.class);
         addFactory(CssClassOnMemberFacetFactory.class);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/disabled/DisabledAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/disabled/DisabledAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/disabled/DisabledAnnotationFacetFactoryTest.java
index 1e7ab80..dd2af4d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/disabled/DisabledAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/disabled/DisabledAnnotationFacetFactoryTest.java
@@ -33,17 +33,17 @@ import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.progmodel.facets.members.disabled.DisabledFacetAbstract;
-import org.apache.isis.core.progmodel.facets.members.disabled.annotation.DisabledAnnotationFacetFactory;
+import org.apache.isis.core.progmodel.facets.members.disabled.annotation.DisabledFacetFactory;
 
 public class DisabledAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
 
-    private DisabledAnnotationFacetFactory facetFactory;
+    private DisabledFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new DisabledAnnotationFacetFactory();
+        facetFactory = new DisabledFacetFactory();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/hidden/HiddenAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/hidden/HiddenAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/hidden/HiddenAnnotationFacetFactoryTest.java
index c3494ff..c96ce8f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/hidden/HiddenAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/hidden/HiddenAnnotationFacetFactoryTest.java
@@ -30,17 +30,17 @@ import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.hide.HiddenFacet;
 import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.progmodel.facets.members.hidden.HiddenFacetAbstract;
-import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenAnnotationForMemberFacetFactory;
+import org.apache.isis.core.progmodel.facets.members.hidden.annotation.HiddenForMemberFacetFactory;
 
 public class HiddenAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
 
-    private HiddenAnnotationForMemberFacetFactory facetFactory;
+    private HiddenForMemberFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new HiddenAnnotationForMemberFacetFactory();
+        facetFactory = new HiddenForMemberFacetFactory();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withRenderAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withRenderAnnotation.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withRenderAnnotation.java
index ec35e88..4b65f1d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withRenderAnnotation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withRenderAnnotation.java
@@ -34,13 +34,13 @@ import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
 
 public class RenderOrResolveAnnotationFacetFactoryTest_withRenderAnnotation extends AbstractFacetFactoryTest {
 
-    private RenderOrResolveAnnotationFacetFactory facetFactory;
+    private RenderOrResolveFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new RenderOrResolveAnnotationFacetFactory();
+        facetFactory = new RenderOrResolveFacetFactory();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withResolveAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withResolveAnnotation.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withResolveAnnotation.java
index 765dfc5..1feecaf 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withResolveAnnotation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/members/resolve/RenderOrResolveAnnotationFacetFactoryTest_withResolveAnnotation.java
@@ -33,13 +33,13 @@ import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
 
 public class RenderOrResolveAnnotationFacetFactoryTest_withResolveAnnotation extends AbstractFacetFactoryTest {
 
-    private RenderOrResolveAnnotationFacetFactory facetFactory;
+    private RenderOrResolveFacetFactory facetFactory;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetFactory = new RenderOrResolveAnnotationFacetFactory();
+        facetFactory = new RenderOrResolveFacetFactory();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.json
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.json b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.json
index b108397..390d5a0 100644
--- a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.json
+++ b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.json
@@ -41,13 +41,22 @@
 			            describedAs: {
 			                value: "Whether this todo item has been completed"
 			            },
-                        cssClass: { value: "x-highlight" }
+                        cssClass: { value: "x-highlight" },
+                        disabled: {
+                            where: ANYWHERE,
+                            when: ALWAYS
+                        }
                     }
                 }
             },
             Misc: {
                 members: {
-                    versionSequence: {}
+                    versionSequence: {
+                        hidden: {
+                            where: ALL_TABLES,
+                            when: ALWAYS 
+                        }
+                    }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
index 03393b7..473f6ad 100644
--- a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
+++ b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/layoutmetadata/json/ExampleDomainObject.layout.properties
@@ -37,6 +37,8 @@ member.complete.memberOrder.name=General
 member.complete.named.value=Done
 member.complete.cssClass.value=x-highlight
 member.complete.describedAs.value=Whether this todo item has been completed
+member.complete.disabled.where=ANYWHERE
+member.complete.disabled.when=ALWAYS
 
 member.description.memberOrder.sequence=1
 member.category.memberOrder.sequence=2
@@ -45,6 +47,8 @@ member.complete.memberOrder.sequence=3
 # Properties (Misc)
 member.versionSequence.memberOrder.name=Misc
 member.versionSequence.memberOrder.sequence=4
+member.versionSequence.hidden.where=ALL_TABLES
+member.versionSequence.hidden.when=ANYWHERE
 
 
 # Properties (Detail)

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index e0290d7..1764574 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -248,7 +248,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     private Category category;
 
     @javax.jdo.annotations.Column(allowsNull="false")
-    @Disabled(reason="Use action to update both category and subcategory")
     public Category getCategory() {
         return category;
     }
@@ -262,7 +261,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     private Subcategory subcategory;
 
     @javax.jdo.annotations.Column(allowsNull="false")
-    @Disabled(reason="Use action to update both category and subcategory")
     public Subcategory getSubcategory() {
         return subcategory;
     }
@@ -278,7 +276,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     private String ownedBy;
 
     @javax.jdo.annotations.Column(allowsNull="false")
-    @Hidden
     public String getOwnedBy() {
         return ownedBy;
     }
@@ -379,7 +376,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     private String notes;
 
     @javax.jdo.annotations.Column(allowsNull="true", length=400)
-    @Hidden(where=Where.ALL_TABLES)
     public String getNotes() {
         return notes;
     }
@@ -396,7 +392,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
 
     @javax.jdo.annotations.Persistent(defaultFetchGroup="false")
     @javax.jdo.annotations.Column(allowsNull="true")
-    @Hidden(where=Where.STANDALONE_TABLES)
     public Blob getAttachment() {
         return attachment;
     }
@@ -409,8 +404,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // Version (derived property)
     // //////////////////////////////////////
 
-    @Hidden(where=Where.ALL_TABLES)
-    @Disabled
     public Long getVersionSequence() {
         if(!(this instanceof PersistenceCapable)) {
             return null;
@@ -452,7 +445,6 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     private SortedSet<ToDoItem> dependencies = new TreeSet<ToDoItem>();
 
     @SortedBy(DependenciesComparator.class)
-    @Disabled
     public SortedSet<ToDoItem> getDependencies() {
         return dependencies;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5e5b07c4/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
index 00d8b48..b980042 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
@@ -24,8 +24,15 @@
                     description: {
                         typicalLength: { value: 50 }
                     },
-                    category: {},
+                    category: {
+                        disabled: {
+                            reason: "Use action to update both category and subcategory"
+                        }
+                    },
                     subcategory: {
+                        disabled: {
+                            reason: "Use action to update both category and subcategory"
+                        },
                         actions: {
                             updateCategory: {
                                 named: {
@@ -35,6 +42,9 @@
                             analyseCategory: {}
                         }
                     },
+                    ownedBy: {
+                        hidden: {}
+                    },
                     complete: {
                         actions: {
                             completed: {
@@ -57,7 +67,13 @@
             Misc: {
                 members: {
                     versionSequence: {
-                        named: { value: "Version" }
+                        named: { 
+                            value: "Version" 
+                        },
+                        disabled: {},
+                        hidden: {
+                            where: ALL_TABLES
+                        }
                     }
                 }
             }
@@ -89,9 +105,16 @@
                     notes: {
                         multiLine: {
                             numberOfLines: 5
+                        },
+                        hidden: {
+                            where: ALL_TABLES
                         }
                     },
-                    attachment: {}
+                    attachment: {
+                        hidden: {
+                            where: STANDALONE_TABLES
+                        }
+                    }
                 }
             }
         }
@@ -103,6 +126,7 @@
         span: 6,
         collections: {
             dependencies: {
+                disabled: {},
                 actions: {
                     add:{},
                     remove: {
@@ -117,6 +141,7 @@
                 }
             },
             similarTo: {
+                disabled: {},
                 paged: {
                     value: 3
                 },