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

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

commit 46965cdaac81182caa2d520e001fe5fd5f9fa3bd
Author: danhaywood <[email protected]>
AuthorDate: Thu Jan 25 17:52:22 2024 +0000

    CAUSEWAY-3676: moves Holder interfaces to be nested static in the types to 
which they relate
---
 .../viewer/graphql/model/domain/GqlvAction.java    | 21 +++++++++-----
 .../graphql/model/domain/GqlvActionHolder.java     | 22 ---------------
 .../graphql/model/domain/GqlvActionInvoke.java     | 12 ++++++--
 .../model/domain/GqlvActionInvokeHolder.java       | 27 ------------------
 .../graphql/model/domain/GqlvActionParam.java      | 28 ++++++++++++++++---
 .../model/domain/GqlvActionParamDisabled.java      | 15 ++++++++--
 .../domain/GqlvActionParamDisabledHolder.java      | 28 -------------------
 .../model/domain/GqlvActionParamHidden.java        | 14 ++++++++--
 .../model/domain/GqlvActionParamHolder.java        | 25 -----------------
 .../graphql/model/domain/GqlvActionParams.java     | 32 ++++++++++++++++------
 .../model/domain/GqlvActionParamsHolder.java       | 28 -------------------
 .../graphql/model/domain/GqlvActionValidate.java   | 12 ++++++--
 .../model/domain/GqlvActionValidateHolder.java     | 26 ------------------
 .../graphql/model/domain/GqlvAssociation.java      |  9 +++---
 .../graphql/model/domain/GqlvAssociationGet.java   | 17 ++++++++----
 .../model/domain/GqlvAssociationGetHolder.java     | 26 ------------------
 .../model/domain/GqlvAssociationHolder.java        | 23 ----------------
 .../graphql/model/domain/GqlvCollection.java       | 17 ++++++++----
 .../graphql/model/domain/GqlvCollectionGet.java    | 11 ++++----
 .../model/domain/GqlvCollectionGetHolder.java      | 25 -----------------
 .../graphql/model/domain/GqlvCollectionHolder.java | 23 ----------------
 .../graphql/model/domain/GqlvDomainObject.java     |  2 +-
 .../graphql/model/domain/GqlvDomainService.java    |  7 +----
 .../viewer/graphql/model/domain/GqlvMember.java    |  8 +++++-
 .../graphql/model/domain/GqlvMemberDisabled.java   | 13 +++++++--
 .../model/domain/GqlvMemberDisabledHolder.java     | 27 ------------------
 .../graphql/model/domain/GqlvMemberHidden.java     | 14 ++++++++--
 .../model/domain/GqlvMemberHiddenHolder.java       | 28 -------------------
 .../graphql/model/domain/GqlvMemberHolder.java     | 27 ------------------
 .../viewer/graphql/model/domain/GqlvProperty.java  | 27 ++++++++++++------
 .../graphql/model/domain/GqlvPropertyGet.java      | 14 ++++++----
 .../model/domain/GqlvPropertyGetHolder.java        | 25 -----------------
 .../graphql/model/domain/GqlvPropertyHolder.java   | 23 ----------------
 .../graphql/model/domain/GqlvPropertySet.java      | 19 ++++++++++---
 .../model/domain/GqlvPropertySetHolder.java        | 28 -------------------
 .../graphql/model/domain/GqlvPropertyValidate.java | 15 ++++++++--
 .../model/domain/GqlvPropertyValidateHolder.java   | 28 -------------------
 37 files changed, 220 insertions(+), 526 deletions(-)

diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
index e7a85406f1..d482c3e1c7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -43,12 +43,12 @@ import static graphql.schema.GraphQLObjectType.newObject;
 
 @Log4j2
 public class GqlvAction
-        extends GqlvMember<ObjectAction, GqlvActionHolder>
-        implements  GqlvMemberHiddenHolder,
-                    GqlvMemberDisabledHolder,
-                    GqlvActionInvokeHolder,
-                    GqlvActionValidateHolder,
-                    GqlvActionParamsHolder {
+        extends GqlvMember<ObjectAction, GqlvAction.Holder>
+        implements GqlvMemberHidden.Holder,
+        GqlvMemberDisabled.Holder,
+        GqlvActionInvoke.Holder,
+        GqlvActionValidate.Holder,
+        GqlvActionParams.Holder {
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     private final GraphQLObjectType gqlObjectType;
@@ -63,7 +63,7 @@ public class GqlvAction
     private final BookmarkService bookmarkService;
 
     public GqlvAction(
-            final GqlvActionHolder holder,
+            final Holder holder,
             final ObjectAction objectAction,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService
@@ -158,6 +158,11 @@ public class GqlvAction
                 .build();
     }
 
+    @Override
+    public ObjectSpecification getObjectSpecification() {
+        return holder.getObjectSpecification();
+    }
+
     @Override
     public ObjectAction getObjectAction() {
         return getObjectMember();
@@ -189,4 +194,6 @@ public class GqlvAction
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
 
+    public interface Holder extends GqlvMember.Holder {
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionHolder.java
deleted file mode 100644
index c974fc4c5d..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionHolder.java
+++ /dev/null
@@ -1,22 +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.causeway.viewer.graphql.model.domain;
-
-public interface GqlvActionHolder extends GqlvMemberHolder {
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
index c5f6adaa88..aaf978202e 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
@@ -44,13 +44,13 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 @Log4j2
 public class GqlvActionInvoke {
 
-    private final GqlvActionInvokeHolder holder;
+    private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final GraphQLFieldDefinition field;
     private final BookmarkService bookmarkService;
 
     public GqlvActionInvoke(
-            final GqlvActionInvokeHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService) {
         this.holder = holder;
@@ -59,7 +59,7 @@ public class GqlvActionInvoke {
         this.bookmarkService = bookmarkService;
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvActionInvokeHolder holder) {
+    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
 
         val objectAction = holder.getObjectAction();
 
@@ -162,4 +162,10 @@ public class GqlvActionInvoke {
 
     }
 
+    public interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        ObjectAction getObjectAction();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvokeHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvokeHolder.java
deleted file mode 100644
index d8d91cfb70..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvokeHolder.java
+++ /dev/null
@@ -1,27 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
-public interface GqlvActionInvokeHolder extends GqlvHolder {
-
-
-    ObjectAction getObjectAction();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
index 56d855da44..4d7efa3c31 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
@@ -19,6 +19,8 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
@@ -34,9 +36,9 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
 @Log4j2
-public class GqlvActionParam implements GqlvActionParamDisabledHolder {
+public class GqlvActionParam implements GqlvActionParamDisabled.Holder, 
GqlvActionParamHidden.Holder {
 
-    @Getter private final GqlvActionParamHolder holder;
+    @Getter private final Holder holder;
     @Getter private final ObjectActionParameter objectActionParameter;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
 
@@ -50,7 +52,7 @@ public class GqlvActionParam implements 
GqlvActionParamDisabledHolder {
     private final GraphQLFieldDefinition field;
 
     public GqlvActionParam(
-            final GqlvActionParamHolder holder,
+            final Holder holder,
             final ObjectActionParameter objectActionParameter,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService
@@ -72,8 +74,17 @@ public class GqlvActionParam implements 
GqlvActionParamDisabledHolder {
                         .build());
     }
 
+    @Override
+    public ObjectSpecification getObjectSpecification() {
+        return holder.getObjectSpecification();
+    }
+
+    @Override
+    public ObjectAction getObjectAction() {
+        return holder.getObjectAction();
+    }
 
-    // @Override
+    @Override
     public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
         gqlObjectTypeBuilder.field(field);
         return field;
@@ -94,4 +105,13 @@ public class GqlvActionParam implements 
GqlvActionParamDisabledHolder {
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
 
+    public static interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        ObjectAction getObjectAction();
+
+        GqlvActionParams.Holder getHolder();
+
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
index a4bd003669..0a95d08ab7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
@@ -22,7 +22,9 @@ import 
org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -40,14 +42,14 @@ import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlA
 @Log4j2
 public class GqlvActionParamDisabled {
 
-    private final GqlvActionParamDisabledHolder holder;
+    private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final BookmarkService bookmarkService;
 
     private final GraphQLFieldDefinition field;
 
     public GqlvActionParamDisabled(
-            final GqlvActionParamDisabledHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService) {
         this.holder = holder;
@@ -94,4 +96,13 @@ public class GqlvActionParamDisabled {
         Consent usable = objectActionParameter.isUsable(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
         return usable.isVetoed() ? 
usable.getReasonAsString().orElse("Disabled") : null;
     }
+
+    public interface Holder extends GqlvHolder {
+
+        GqlvActionParam.Holder getHolder();
+
+        ObjectSpecification getObjectSpecification();
+        ObjectAction getObjectAction();
+        ObjectActionParameter getObjectActionParameter();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabledHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabledHolder.java
deleted file mode 100644
index 6feb0bb344..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabledHolder.java
+++ /dev/null
@@ -1,28 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
-
-public interface GqlvActionParamDisabledHolder extends GqlvHolder {
-
-    GqlvActionParamHolder getHolder();
-
-    ObjectActionParameter getObjectActionParameter();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
index 07a3a1a48b..768f699600 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
@@ -23,6 +23,7 @@ import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
@@ -39,14 +40,14 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 @Log4j2
 public class GqlvActionParamHidden {
 
-    private final GqlvActionParamDisabledHolder holder;
+    private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final BookmarkService bookmarkService;
 
     private final GraphQLFieldDefinition field;
 
     public GqlvActionParamHidden(
-            final GqlvActionParamDisabledHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService) {
         this.holder = holder;
@@ -92,4 +93,13 @@ public class GqlvActionParamHidden {
         Consent visible = 
objectActionParameter.isVisible(actionInteractionHead, argumentManagedObjects, 
InteractionInitiatedBy.USER);
         return visible.isVetoed();
     }
+
+    public interface Holder extends GqlvHolder {
+
+        GqlvActionParam.Holder getHolder();
+
+        ObjectAction getObjectAction();
+
+        ObjectActionParameter getObjectActionParameter();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHolder.java
deleted file mode 100644
index 3a70f186fc..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHolder.java
+++ /dev/null
@@ -1,25 +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.causeway.viewer.graphql.model.domain;
-
-public interface GqlvActionParamHolder extends GqlvHolder {
-
-    GqlvActionParamsHolder getHolder();
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
index 1c6bef0bc6..c494061d53 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
@@ -19,33 +19,29 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
-import lombok.AccessLevel;
 import lombok.Getter;
-import lombok.Setter;
-import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-import graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
 @Log4j2
-public class GqlvActionParams implements GqlvActionParamHolder {
+public class GqlvActionParams implements GqlvActionParam.Holder {
 
-    @Getter private final GqlvActionParamsHolder holder;
+    @Getter private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
@@ -60,7 +56,7 @@ public class GqlvActionParams implements 
GqlvActionParamHolder {
     private final Map<String, GqlvActionParam> params = new LinkedHashMap<>();
 
     public GqlvActionParams(
-            final GqlvActionParamsHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService
             ) {
@@ -81,6 +77,16 @@ public class GqlvActionParams implements 
GqlvActionParamHolder {
                 : null;
     }
 
+    @Override
+    public ObjectSpecification getObjectSpecification() {
+        return holder.getObjectSpecification();
+    }
+
+    @Override
+    public ObjectAction getObjectAction() {
+        return holder.getObjectAction();
+    }
+
     public boolean hasParams() {
         return !params.isEmpty();
     }
@@ -110,4 +116,12 @@ public class GqlvActionParams implements 
GqlvActionParamHolder {
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
 
+    public interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        ObjectAction getObjectAction();
+
+        GqlvAction.Holder getHolder();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamsHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamsHolder.java
deleted file mode 100644
index 5278c17d5c..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamsHolder.java
+++ /dev/null
@@ -1,28 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
-public interface GqlvActionParamsHolder extends GqlvHolder {
-
-    ObjectAction getObjectAction();
-
-    GqlvActionHolder getHolder();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
index 3ee3de176f..d0052c3c23 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidate.java
@@ -25,6 +25,7 @@ import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
@@ -42,12 +43,12 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 @Log4j2
 public class GqlvActionValidate {
 
-    private final GqlvActionValidateHolder holder;
+    private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final GraphQLFieldDefinition field;
 
     public GqlvActionValidate(
-            final GqlvActionValidateHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder
     ) {
         this.holder = holder;
@@ -55,7 +56,7 @@ public class GqlvActionValidate {
         this.field = fieldDefinition(holder);
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvActionValidateHolder holder) {
+    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
 
         val objectAction = holder.getObjectAction();
 
@@ -111,4 +112,9 @@ public class GqlvActionValidate {
         return consent.isVetoed() ? 
consent.getReasonAsString().orElse("Invalid") : null;
     }
 
+    public interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+        ObjectAction getObjectAction();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidateHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidateHolder.java
deleted file mode 100644
index 9aeb23920a..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidateHolder.java
+++ /dev/null
@@ -1,26 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
-public interface GqlvActionValidateHolder extends GqlvHolder {
-
-    ObjectAction getObjectAction();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
index 4b8f31bf96..c665462736 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
@@ -18,16 +18,13 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.applib.services.metamodel.BeanSort;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 
-import graphql.schema.DataFetcher;
 import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 
-public abstract class GqlvAssociation<T extends ObjectAssociation, H extends 
GqlvAssociationHolder> extends GqlvMember<T, H> {
+public abstract class GqlvAssociation<T extends ObjectAssociation, H extends 
GqlvAssociation.Holder> extends GqlvMember<T, H> {
 
     public GqlvAssociation(
             final H holder,
@@ -57,4 +54,8 @@ public abstract class GqlvAssociation<T extends 
ObjectAssociation, H extends Gql
         return getObjectMember();
     }
 
+    public interface Holder extends GqlvMember.Holder {
+
+        ObjectSpecification getObjectSpecification();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
index fb8a32d616..148020fc59 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
@@ -19,10 +19,9 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
@@ -35,13 +34,13 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 public abstract class GqlvAssociationGet<T extends ObjectAssociation> {
 
-    final GqlvAssociationGetHolder<T> holder;
+    final Holder<T> holder;
     final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     final SpecificationLoader specificationLoader;
     final GraphQLFieldDefinition field;
 
     public GqlvAssociationGet(
-            final GqlvAssociationGetHolder<T> holder,
+            final Holder<T> holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final SpecificationLoader specificationLoader) {
         this.holder = holder;
@@ -50,7 +49,7 @@ public abstract class GqlvAssociationGet<T extends 
ObjectAssociation> {
         this.specificationLoader = specificationLoader;
     }
 
-    GraphQLFieldDefinition fieldDefinition(final GqlvAssociationGetHolder<T> 
holder) {
+    GraphQLFieldDefinition fieldDefinition(final Holder<T> holder) {
 
         GraphQLFieldDefinition fieldDefinition = null;
         GraphQLOutputType type = outputTypeFor(holder);
@@ -65,7 +64,7 @@ public abstract class GqlvAssociationGet<T extends 
ObjectAssociation> {
         return fieldDefinition;
     }
 
-    abstract GraphQLOutputType outputTypeFor(GqlvAssociationGetHolder<T> 
holder);
+    abstract GraphQLOutputType outputTypeFor(Holder<T> holder);
 
     void addDataFetcher() {
 
@@ -109,4 +108,10 @@ public abstract class GqlvAssociationGet<T extends 
ObjectAssociation> {
                 : null;
     }
 
+    public interface Holder<T extends ObjectAssociation> extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        T getObjectAssociation();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGetHolder.java
deleted file mode 100644
index 60374717b1..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGetHolder.java
+++ /dev/null
@@ -1,26 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
-
-public interface GqlvAssociationGetHolder<T extends ObjectAssociation> extends 
GqlvHolder {
-
-    T getObjectAssociation();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationHolder.java
deleted file mode 100644
index 5edfb3b083..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationHolder.java
+++ /dev/null
@@ -1,23 +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.causeway.viewer.graphql.model.domain;
-
-public interface GqlvAssociationHolder extends GqlvMemberHolder {
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
index 54525e2c1a..4317e03449 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
@@ -19,13 +19,10 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
-import lombok.val;
-
-import graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
@@ -34,7 +31,7 @@ import graphql.schema.GraphQLObjectType;
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
-public class GqlvCollection extends GqlvAssociation<OneToManyAssociation, 
GqlvCollectionHolder> implements GqlvCollectionGetHolder, 
GqlvMemberHiddenHolder, GqlvMemberDisabledHolder {
+public class GqlvCollection extends GqlvAssociation<OneToManyAssociation, 
GqlvCollection.Holder> implements GqlvCollectionGet.Holder, 
GqlvMemberHidden.Holder, GqlvMemberDisabled.Holder {
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     private final GraphQLObjectType gqlObjectType;
@@ -44,7 +41,7 @@ public class GqlvCollection extends 
GqlvAssociation<OneToManyAssociation, GqlvCo
     private final BookmarkService bookmarkService;
 
     public GqlvCollection(
-            final GqlvCollectionHolder domainObject,
+            final Holder domainObject,
             final OneToManyAssociation oneToManyAssociation,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService
@@ -70,6 +67,10 @@ public class GqlvCollection extends 
GqlvAssociation<OneToManyAssociation, GqlvCo
         );
     }
 
+    @Override
+    public ObjectSpecification getObjectSpecification() {
+        return holder.getObjectSpecification();
+    }
 
     public OneToManyAssociation getOneToManyAssociation() {
         return getObjectAssociation();
@@ -95,4 +96,8 @@ public class GqlvCollection extends 
GqlvAssociation<OneToManyAssociation, GqlvCo
     public FieldCoordinates coordinatesFor(GraphQLFieldDefinition 
fieldDefinition) {
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
+
+    public interface Holder extends GqlvAssociation.Holder {
+
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
index d71e317bcd..8e88cda94c 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
@@ -18,16 +18,14 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
-import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
@@ -35,16 +33,19 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvCollectionGet extends 
GqlvAssociationGet<OneToManyAssociation> {
 
     public GqlvCollectionGet(
-            final GqlvCollectionGetHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final SpecificationLoader specificationLoader) {
         super(holder, codeRegistryBuilder, specificationLoader);
     }
 
     @Override
-    GraphQLOutputType 
outputTypeFor(GqlvAssociationGetHolder<OneToManyAssociation> holder) {
+    GraphQLOutputType 
outputTypeFor(GqlvAssociationGet.Holder<OneToManyAssociation> holder) {
         val oneToManyAssociation = holder.getObjectAssociation();
         return TypeMapper.listTypeForElementTypeOf(oneToManyAssociation);
     }
 
+    public interface Holder extends 
GqlvAssociationGet.Holder<OneToManyAssociation> {
+
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
deleted file mode 100644
index 326a27654c..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
+++ /dev/null
@@ -1,25 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
-
-public interface GqlvCollectionGetHolder extends 
GqlvAssociationGetHolder<OneToManyAssociation> {
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionHolder.java
deleted file mode 100644
index b35649e084..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionHolder.java
+++ /dev/null
@@ -1,23 +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.causeway.viewer.graphql.model.domain;
-
-public interface GqlvCollectionHolder extends GqlvAssociationHolder {
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index 8fab010f98..84cc2ff9ff 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -47,7 +47,7 @@ import static graphql.schema.GraphQLObjectType.newObject;
 /**
  * Exposes a domain object (view model or entity) via the GQL viewer.
  */
-public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, 
GqlvCollectionHolder, GqlvMetaHolder {
+public class GqlvDomainObject implements GqlvAction.Holder, 
GqlvProperty.Holder, GqlvCollection.Holder, GqlvMetaHolder {
 
     @Getter private final ObjectSpecification objectSpecification;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
index 9e99eed048..a860e8884e 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
@@ -18,11 +18,8 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import java.util.ArrayList;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.core.metamodel.spec.ActionScope;
@@ -30,11 +27,9 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry;
 import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import lombok.Getter;
-import lombok.val;
 
 import graphql.schema.FieldCoordinates;
 import graphql.schema.GraphQLCodeRegistry;
@@ -48,7 +43,7 @@ import static graphql.schema.GraphQLObjectType.newObject;
 /**
  * Exposes a domain service (view model or entity) via the GQL viewer.
  */
-public class GqlvDomainService implements GqlvActionHolder {
+public class GqlvDomainService implements GqlvAction.Holder {
 
     @Getter private final ObjectSpecification objectSpecification;
     @Getter private final Object servicePojo;
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
index 0a6188bfdd..f8961f9dff 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
@@ -18,6 +18,7 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 
@@ -29,7 +30,7 @@ import graphql.schema.GraphQLFieldDefinition;
 
 import lombok.Setter;
 
-public abstract class GqlvMember<T extends ObjectMember, H extends 
GqlvMemberHolder> {
+public abstract class GqlvMember<T extends ObjectMember, H extends 
GqlvMember.Holder> {
 
     @Getter final H holder;
     @Getter private final T objectMember;
@@ -64,4 +65,9 @@ public abstract class GqlvMember<T extends ObjectMember, H 
extends GqlvMemberHol
         return objectMember.getFeatureIdentifier().getFullIdentityString();
     }
 
+    public static interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
index d9118297fe..c6be053246 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
@@ -21,6 +21,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -36,12 +37,12 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 @Log4j2
 public class GqlvMemberDisabled {
 
-    private final GqlvMemberDisabledHolder holder;
+    private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final GraphQLFieldDefinition field;
 
     public GqlvMemberDisabled(
-            final GqlvMemberDisabledHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder
     ) {
         this.holder = holder;
@@ -49,7 +50,7 @@ public class GqlvMemberDisabled {
         this.field = fieldDefinition(holder);
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvMemberDisabledHolder holder) {
+    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
 
         GraphQLFieldDefinition fieldDefinition =
                 newFieldDefinition()
@@ -89,4 +90,10 @@ public class GqlvMemberDisabled {
         return usable.getReasonAsString().orElse(null);
     }
 
+    public interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        ObjectMember getObjectMember();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabledHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabledHolder.java
deleted file mode 100644
index 3fde923567..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabledHolder.java
+++ /dev/null
@@ -1,27 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-
-public interface GqlvMemberDisabledHolder extends GqlvHolder {
-
-
-    ObjectMember getObjectMember();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
index fccb4e557a..ce5f081408 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
@@ -21,6 +21,8 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.extern.log4j.Log4j2;
@@ -36,12 +38,12 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 @Log4j2
 public class GqlvMemberHidden {
 
-    private final GqlvMemberHiddenHolder holder;
+    private final Holder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     private final GraphQLFieldDefinition field;
 
     public GqlvMemberHidden(
-            final GqlvMemberHiddenHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder
     ) {
         this.holder = holder;
@@ -49,7 +51,7 @@ public class GqlvMemberHidden {
         this.field = fieldDefinition(holder);
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvMemberHiddenHolder holder) {
+    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
 
         GraphQLFieldDefinition fieldDefinition =
                 newFieldDefinition()
@@ -89,4 +91,10 @@ public class GqlvMemberHidden {
         return visibleConsent.isVetoed();
     }
 
+    public interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        ObjectMember getObjectMember();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHiddenHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHiddenHolder.java
deleted file mode 100644
index 85b705fef4..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHiddenHolder.java
+++ /dev/null
@@ -1,28 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-
-public interface GqlvMemberHiddenHolder extends GqlvHolder {
-
-
-    ObjectMember getObjectMember();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java
deleted file mode 100644
index a342c617f7..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java
+++ /dev/null
@@ -1,27 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-
-public interface GqlvMemberHolder extends GqlvHolder {
-
-    ObjectSpecification getObjectSpecification();
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
index cdb6b78916..f7a9ee1ef7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
@@ -20,24 +20,23 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 import org.apache.causeway.viewer.graphql.model.util.TypeNames;
 
 import graphql.schema.*;
 
-import lombok.val;
-
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
 public class GqlvProperty
-        extends GqlvAssociation<OneToOneAssociation, GqlvPropertyHolder>
-        implements GqlvMemberHiddenHolder,
-                   GqlvMemberDisabledHolder,
-                   GqlvPropertyGetHolder,
-                   GqlvPropertySetHolder,
-                   GqlvPropertyValidateHolder {
+        extends GqlvAssociation<OneToOneAssociation, GqlvProperty.Holder>
+        implements GqlvMemberHidden.Holder,
+        GqlvMemberDisabled.Holder,
+        GqlvPropertyGet.Holder,
+        GqlvPropertySet.Holder,
+        GqlvPropertyValidate.Holder {
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     private final GraphQLObjectType gqlObjectType;
@@ -49,7 +48,7 @@ public class GqlvProperty
     private final BookmarkService bookmarkService;
 
     public GqlvProperty(
-            final GqlvPropertyHolder holder,
+            final Holder holder,
             final OneToOneAssociation oneToOneAssociation,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService
@@ -94,6 +93,11 @@ public class GqlvProperty
     }
 
 
+    @Override
+    public ObjectSpecification getObjectSpecification() {
+        return holder.getObjectSpecification();
+    }
+
     public OneToOneAssociation getOneToOneAssociation() {
         return getObjectAssociation();
     }
@@ -121,4 +125,9 @@ public class GqlvProperty
     public FieldCoordinates coordinatesFor(GraphQLFieldDefinition 
fieldDefinition) {
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
+
+
+    public interface Holder extends GqlvAssociation.Holder {
+
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
index d67944f14f..063646bfb7 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
@@ -18,17 +18,14 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 
-import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
@@ -36,16 +33,21 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 public class GqlvPropertyGet  extends GqlvAssociationGet<OneToOneAssociation> {
 
     public GqlvPropertyGet(
-            final GqlvPropertyGetHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final SpecificationLoader specificationLoader) {
         super(holder, codeRegistryBuilder, specificationLoader);
     }
 
     @Override
-    GraphQLOutputType 
outputTypeFor(GqlvAssociationGetHolder<OneToOneAssociation> holder) {
+    GraphQLOutputType 
outputTypeFor(GqlvAssociationGet.Holder<OneToOneAssociation> holder) {
         val oneToOneAssociation = holder.getObjectAssociation();
         return TypeMapper.outputTypeFor(oneToOneAssociation);
     }
 
+    public interface Holder extends 
GqlvAssociationGet.Holder<OneToOneAssociation> {
+
+        @Override
+        OneToOneAssociation getObjectAssociation();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
deleted file mode 100644
index 0f68abb1a6..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
+++ /dev/null
@@ -1,25 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-
-public interface GqlvPropertyGetHolder extends 
GqlvAssociationGetHolder<OneToOneAssociation> {
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyHolder.java
deleted file mode 100644
index 956c663d39..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyHolder.java
+++ /dev/null
@@ -1,23 +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.causeway.viewer.graphql.model.domain;
-
-public interface GqlvPropertyHolder extends GqlvAssociationHolder {
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
index 1d3e14d576..55805643c4 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
@@ -21,6 +21,8 @@ package org.apache.causeway.viewer.graphql.model.domain;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -37,13 +39,13 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 public class GqlvPropertySet {
 
-    final GqlvPropertySetHolder holder;
+    final Holder holder;
     final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     final SpecificationLoader specificationLoader;
     final GraphQLFieldDefinition field;
 
     public GqlvPropertySet(
-            final GqlvPropertySetHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final SpecificationLoader specificationLoader) {
         this.holder = holder;
@@ -52,7 +54,7 @@ public class GqlvPropertySet {
         this.specificationLoader = specificationLoader;
     }
 
-    GraphQLFieldDefinition fieldDefinition(final GqlvPropertySetHolder holder) 
{
+    GraphQLFieldDefinition fieldDefinition(final Holder holder) {
 
         GraphQLFieldDefinition fieldDefinition = null;
         GraphQLOutputType type = outputTypeFor(holder);
@@ -68,7 +70,7 @@ public class GqlvPropertySet {
         return fieldDefinition;
     }
 
-    GraphQLOutputType outputTypeFor(GqlvPropertySetHolder holder) {
+    GraphQLOutputType outputTypeFor(Holder holder) {
         return 
TypeMapper.outputTypeFor(holder.getHolder().getObjectSpecification());   // 
setters return void, so we return the domain object instead
     }
 
@@ -120,4 +122,13 @@ public class GqlvPropertySet {
         return managedObject; // return the original object because setters 
return void
     }
 
+    public interface Holder extends GqlvHolder {
+
+        GqlvProperty.Holder getHolder();
+
+        ObjectSpecification getObjectSpecification();
+
+        OneToOneAssociation getOneToOneAssociation();
+
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySetHolder.java
deleted file mode 100644
index 20af8785f7..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySetHolder.java
+++ /dev/null
@@ -1,28 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-
-public interface GqlvPropertySetHolder extends GqlvHolder {
-
-    OneToOneAssociation getOneToOneAssociation();
-
-    GqlvPropertyHolder getHolder();
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
index 25ee82bb98..e4431ff18d 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.causeway.core.metamodel.consent.Consent;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
@@ -38,13 +39,13 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 public class GqlvPropertyValidate {
 
-    final GqlvPropertyValidateHolder holder;
+    final Holder holder;
     final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     final SpecificationLoader specificationLoader;
     final GraphQLFieldDefinition field;
 
     public GqlvPropertyValidate(
-            final GqlvPropertyValidateHolder holder,
+            final Holder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final SpecificationLoader specificationLoader) {
         this.holder = holder;
@@ -53,7 +54,7 @@ public class GqlvPropertyValidate {
         this.specificationLoader = specificationLoader;
     }
 
-    GraphQLFieldDefinition fieldDefinition(final GqlvPropertyValidateHolder 
holder) {
+    GraphQLFieldDefinition fieldDefinition(final Holder holder) {
 
         GraphQLFieldDefinition fieldDefinition = null;
         GraphQLOutputType type = outputTypeFor();
@@ -115,4 +116,12 @@ public class GqlvPropertyValidate {
         return consent.isVetoed() ? 
consent.getReasonAsString().orElse("invalid") : null;
     }
 
+    public interface Holder extends GqlvHolder {
+
+        ObjectSpecification getObjectSpecification();
+
+        OneToOneAssociation getOneToOneAssociation();
+
+        GqlvProperty.Holder getHolder();
+    }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidateHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidateHolder.java
deleted file mode 100644
index 616bf45f1c..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidateHolder.java
+++ /dev/null
@@ -1,28 +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.causeway.viewer.graphql.model.domain;
-
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-
-public interface GqlvPropertyValidateHolder extends GqlvHolder {
-
-    OneToOneAssociation getOneToOneAssociation();
-
-    GqlvPropertyHolder getHolder();
-}

Reply via email to