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


The following commit(s) were added to refs/heads/CAUSEWAY-3676 by this push:
     new 9022c65345 CAUSEWAY-3676: refactors TypeMapper into a service
9022c65345 is described below

commit 9022c65345bd191239a2bd0318ca0c5a2c50c83a
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 26 15:12:47 2024 +0000

    CAUSEWAY-3676: refactors TypeMapper into a service
---
 .../viewer/graphql/model/context/Context.java      |   2 +
 .../viewer/graphql/model/domain/GqlvAction.java    |  73 +++-
 .../graphql/model/domain/GqlvActionInvoke.java     |  25 +-
 .../graphql/model/domain/GqlvActionParam.java      |  16 +
 .../model/domain/GqlvActionParamAutoComplete.java  |  15 +-
 .../model/domain/GqlvActionParamChoices.java       |  13 +-
 .../model/domain/GqlvActionParamDefault.java       |  13 +-
 .../model/domain/GqlvActionParamDisabled.java      |  12 +-
 .../model/domain/GqlvActionParamHidden.java        |  12 +-
 .../model/domain/GqlvActionParamValidate.java      |   8 +-
 .../graphql/model/domain/GqlvActionParams.java     |  12 +
 .../graphql/model/domain/GqlvActionValidity.java   |  11 +-
 .../graphql/model/domain/GqlvCollectionGet.java    |   2 +-
 .../graphql/model/domain/GqlvMemberDisabled.java   |  17 +-
 .../graphql/model/domain/GqlvMemberHidden.java     |  17 +-
 .../viewer/graphql/model/domain/GqlvProperty.java  |   6 +-
 .../model/domain/GqlvPropertyAutoComplete.java     |   4 +-
 .../graphql/model/domain/GqlvPropertyChoices.java  |  14 +-
 .../graphql/model/domain/GqlvPropertyGet.java      |   2 +-
 .../graphql/model/domain/GqlvPropertySet.java      |   6 +-
 .../graphql/model/domain/GqlvPropertyValidate.java |   7 +-
 .../viewer/graphql/model/types/TypeMapper.java     |  30 +-
 .../viewer/test/domain/calc/Calculator.java        |  61 +++-
 .../graphql/viewer/test/domain/calc/Month.java     |  23 ++
 .../viewer/test/domain/calc/Month_Test.java        |  15 +
 ...ulator_IntegTest.add_big_decimals.approved.json |   9 +
 ...ulator_IntegTest.add_big_integers.approved.json |   9 +
 .../Calculator_IntegTest.add_double_wrappers._.gql |   7 +
 ...tor_IntegTest.add_double_wrappers.approved.json |   9 +
 .../Calculator_IntegTest.add_float_wrappers._.gql  |   7 +
 ...ator_IntegTest.add_float_wrappers.approved.json |   9 +
 .../Calculator_IntegTest.add_floats.approved.json  |   9 +
 ...Calculator_IntegTest.add_integer_wrappers._.gql |   7 +
 ...or_IntegTest.add_integer_wrappers.approved.json |   9 +
 .../test/e2e/Calculator_IntegTest.concat._.gql     |   7 +
 .../e2e/Calculator_IntegTest.concat.approved.json  |   9 +
 .../viewer/test/e2e/Calculator_IntegTest.java      |  54 ++-
 .../test/e2e/Calculator_IntegTest.next_month._.gql |   7 +
 .../Calculator_IntegTest.next_month.approved.json  |   9 +
 .../Calculator_IntegTest.plus_days.approved.json   |   9 +
 .../e2e/Calculator_IntegTest.plus_joda_days._.gql  |   7 +
 ...lculator_IntegTest.plus_joda_days.approved.json |   9 +
 .../src/test/resources/application-test.properties |   4 +-
 .../graphql/test/src/test/resources/schema.gql     | 400 +++++++++++++++++----
 .../integration/GraphQlSourceForCauseway.java      |   4 +-
 45 files changed, 807 insertions(+), 203 deletions(-)

diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
index cb37c5cb01..325ac6e3dc 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/context/Context.java
@@ -24,6 +24,7 @@ import lombok.RequiredArgsConstructor;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
@@ -33,4 +34,5 @@ public class Context {
     public final GraphQLCodeRegistry.Builder codeRegistryBuilder;
     public final BookmarkService bookmarkService;
     public final SpecificationLoader specificationLoader;
+    public final TypeMapper typeMapper;
 }
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 04bf02b77b..6a64d44d74 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
@@ -36,9 +36,12 @@ import graphql.schema.*;
 import lombok.extern.log4j.Log4j2;
 import lombok.val;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -103,8 +106,7 @@ public class GqlvAction
                     switch (elementType.getBeanSort()) {
 
                         case VALUE:
-                            // TODO: handle lists of values.
-                            return ManagedObject.adaptParameter(oap, 
argumentValue);
+                            return adaptValue(oap, argumentValue);
 
                         case ENTITY:
                         case VIEW_MODEL:
@@ -138,14 +140,51 @@ public class GqlvAction
                 });
     }
 
-    private static ManagedObject asDomainObject(
-            final ObjectSpecification elementType,
+    private static ManagedObject adaptValue(
             final ObjectActionParameter oap,
-            final Object argumentValueObj,
-            final BookmarkService bookmarkService) {
-        return asPojo(elementType, argumentValueObj, bookmarkService)
-                .map(pojo -> ManagedObject.adaptParameter(oap, pojo))
-                .orElse(ManagedObject.empty(elementType));
+            final Object argumentValue) {
+
+        val elementType = oap.getElementType();
+        if (argumentValue == null) {
+            return ManagedObject.empty(elementType);
+        }
+
+        val argPojo = adaptPojo(argumentValue, elementType);
+        return ManagedObject.adaptParameter(oap, argPojo);
+    }
+
+    private static Object adaptPojo(
+            final Object argumentValue,
+            ObjectSpecification elementType) {
+        val elementClazz = elementType.getCorrespondingClass();
+
+        if (elementClazz.isEnum()) {
+            return Enum.valueOf((Class<Enum>) elementClazz, 
argumentValue.toString());
+        }
+
+        if (elementClazz == BigInteger.class) {
+            return BigInteger.valueOf((Integer) argumentValue);
+        }
+
+        if (elementClazz == BigDecimal.class) {
+            return BigDecimal.valueOf((Double) argumentValue);
+        }
+
+        if (elementClazz == LocalDate.class) {
+            String argumentStr = (String) argumentValue;
+            return LocalDate.parse(argumentStr, 
DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        }
+
+        if (elementClazz == org.joda.time.LocalDate.class) {
+            String argumentStr = (String) argumentValue;
+            return org.joda.time.LocalDate.parse(argumentStr, 
org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd"));
+        }
+
+        if (elementClazz == float.class || elementClazz == Float.class) {
+            return ((Double) argumentValue).floatValue();
+        }
+
+        return argumentValue;
     }
 
     private static Optional<Object> asPojo(
@@ -163,7 +202,7 @@ public class GqlvAction
 ;
     }
 
-    static void addGqlArguments(
+    public void addGqlArguments(
             final ObjectAction objectAction,
             final GraphQLFieldDefinition.Builder builder,
             final TypeMapper.InputContext inputContext,
@@ -179,7 +218,7 @@ public class GqlvAction
         }
     }
 
-    static void addGqlArgument(
+    public void addGqlArgument(
             final ObjectAction objectAction,
             final GraphQLFieldDefinition.Builder builder,
             final TypeMapper.InputContext inputContext,
@@ -194,7 +233,7 @@ public class GqlvAction
         }
     }
 
-    static GraphQLArgument gqlArgumentFor(
+    GraphQLArgument gqlArgumentFor(
             final ObjectActionParameter objectActionParameter,
             final TypeMapper.InputContext inputContext) {
         return objectActionParameter.isPlural()
@@ -202,21 +241,21 @@ public class GqlvAction
                 : gqlArgumentFor((OneToOneActionParameter) 
objectActionParameter, inputContext);
     }
 
-    static GraphQLArgument gqlArgumentFor(
+    GraphQLArgument gqlArgumentFor(
             final OneToOneActionParameter oneToOneActionParameter,
             final TypeMapper.InputContext inputContext) {
         return GraphQLArgument.newArgument()
                 .name(oneToOneActionParameter.getId())
-                .type(TypeMapper.inputTypeFor(oneToOneActionParameter, 
inputContext))
+                .type(context.typeMapper.inputTypeFor(oneToOneActionParameter, 
inputContext))
                 .build();
     }
 
-    static GraphQLArgument gqlArgumentFor(
+    GraphQLArgument gqlArgumentFor(
             final OneToManyActionParameter oneToManyActionParameter,
             final TypeMapper.InputContext inputContext) {
         return GraphQLArgument.newArgument()
                 .name(oneToManyActionParameter.getId())
-                .type(TypeMapper.inputTypeFor(oneToManyActionParameter, 
inputContext))
+                
.type(context.typeMapper.inputTypeFor(oneToManyActionParameter, inputContext))
                 .build();
     }
 
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 20d0a7da09..d0ca5e0890 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
@@ -59,25 +59,19 @@ public class GqlvActionInvoke {
             final Context context) {
         this.holder = holder;
         this.context = context;
-        this.field = fieldDefinition(holder);
-    }
-
-    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
 
         val objectAction = holder.getObjectAction();
 
-        GraphQLFieldDefinition fieldDefinition = null;
         GraphQLOutputType type = typeFor(objectAction);
         if (type != null) {
             val fieldBuilder = newFieldDefinition()
                     .name(fieldNameForSemanticsOf(objectAction))
                     .type(type);
-            GqlvAction.addGqlArguments(objectAction, fieldBuilder, 
TypeMapper.InputContext.INVOKE, objectAction.getParameterCount());
-            fieldDefinition = fieldBuilder.build();
-
-            holder.addField(fieldDefinition);
+            holder.addGqlArguments(objectAction, fieldBuilder, 
TypeMapper.InputContext.INVOKE, objectAction.getParameterCount());
+            this.field = holder.addField(fieldBuilder.build());
+        } else {
+            this.field = null;
         }
-        return fieldDefinition;
     }
 
     private static String fieldNameForSemanticsOf(ObjectAction objectAction) {
@@ -97,7 +91,7 @@ public class GqlvActionInvoke {
     }
 
     @Nullable
-    private static GraphQLOutputType typeFor(final ObjectAction objectAction){
+    private GraphQLOutputType typeFor(final ObjectAction objectAction){
         ObjectSpecification objectSpecification = objectAction.getReturnType();
         switch (objectSpecification.getBeanSort()){
 
@@ -109,7 +103,7 @@ public class GqlvActionInvoke {
                     return null;
                 }
                 val objectSpecificationOfCollectionElement = 
facet.elementSpec();
-                GraphQLType wrappedType = 
TypeMapper.outputTypeFor(objectSpecificationOfCollectionElement);
+                GraphQLType wrappedType = 
context.typeMapper.outputTypeFor(objectSpecificationOfCollectionElement);
                 if (wrappedType == null) {
                     log.warn("Unable to create wrapped type of for {} for 
action {}",
                             
objectSpecificationOfCollectionElement.getFullIdentifier(),
@@ -122,7 +116,7 @@ public class GqlvActionInvoke {
             case ENTITY:
             case VIEW_MODEL:
             default:
-                return TypeMapper.outputTypeFor(objectSpecification);
+                return context.typeMapper.outputTypeFor(objectSpecification);
 
         }
     }
@@ -173,5 +167,10 @@ public class GqlvActionInvoke {
                     ObjectSpecificationProvider,
                     ObjectActionProvider {
 
+        void addGqlArguments(
+                final ObjectAction objectAction,
+                final GraphQLFieldDefinition.Builder fieldBuilder,
+                final TypeMapper.InputContext inputContext,
+                final int parameterCount);
     }
 }
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 da00e37958..4a10ac9750 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
@@ -25,6 +25,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
+import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
@@ -148,11 +149,26 @@ public class GqlvActionParam
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
 
+    @Override
+    public void addGqlArguments(ObjectAction objectAction, 
GraphQLFieldDefinition.Builder fieldBuilder, TypeMapper.InputContext 
inputContext, int paramNum) {
+        holder.addGqlArguments(objectAction, fieldBuilder, inputContext, 
paramNum);
+    }
+
+    @Override
+    public void addGqlArgument(ObjectAction objectAction, 
GraphQLFieldDefinition.Builder fieldBuilder, TypeMapper.InputContext 
inputContext, int paramNum) {
+
+    }
+
 
     public interface Holder
             extends GqlvHolder,
                     ObjectSpecificationProvider,
                     ObjectActionProvider {
 
+        void addGqlArguments(
+                ObjectAction objectAction,
+                GraphQLFieldDefinition.Builder fieldBuilder,
+                TypeMapper.InputContext inputContext,
+                int paramNum);
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
index 8f0d0cc7da..ed3f822c8b 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
@@ -27,6 +27,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
  import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
  import org.apache.causeway.core.metamodel.object.ManagedObject;
+ import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
  import org.apache.causeway.viewer.graphql.model.context.Context;
  import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
@@ -36,8 +37,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
  import static graphql.schema.GraphQLNonNull.nonNull;
 
- import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
-
  import graphql.schema.GraphQLArgument;
 
  import lombok.val;
@@ -73,11 +72,11 @@ package org.apache.causeway.viewer.graphql.model.domain;
              val elementType = objectActionParameter.getElementType();
              val fieldBuilder = newFieldDefinition()
                      .name("autoComplete")
-                     
.type(GraphQLList.list(TypeMapper.outputTypeFor(elementType)));
-             addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.AUTOCOMPLETE, holder.getParamNum());
+                     
.type(GraphQLList.list(context.typeMapper.outputTypeFor(elementType)));
+             holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.AUTOCOMPLETE, holder.getParamNum());
              fieldBuilder.argument(GraphQLArgument.newArgument()
                      .name(SEARCH_PARAM_NAME)
-                     .type(nonNull(TypeMapper.scalarTypeFor(String.class))))
+                     
.type(nonNull(context.typeMapper.scalarTypeFor(String.class))))
                      .build();
              this.field = holder.addField(fieldBuilder.build());
          } else {
@@ -126,5 +125,11 @@ package org.apache.causeway.viewer.graphql.model.domain;
              ObjectActionProvider,
              ObjectActionParameterProvider {
          GqlvActionParam.Holder getHolder();
+
+         void addGqlArguments(
+                 ObjectAction objectAction,
+                 GraphQLFieldDefinition.Builder fieldBuilder,
+                 TypeMapper.InputContext inputContext,
+                 int paramNum);
      }
  }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
index 0d8d528843..d48720d575 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
@@ -24,6 +24,7 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
@@ -31,8 +32,6 @@ import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
-import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
-
 import graphql.schema.GraphQLList;
 
 import lombok.val;
@@ -69,8 +68,8 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
              val elementType = objectActionParameter.getElementType();
              val fieldBuilder = newFieldDefinition()
                      .name("choices")
-                     
.type(GraphQLList.list(TypeMapper.outputTypeFor(elementType)));
-             addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.CHOICES, holder.getParamNum());
+                     
.type(GraphQLList.list(context.typeMapper.outputTypeFor(elementType)));
+             holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.CHOICES, holder.getParamNum());
              this.field = holder.addField(fieldBuilder.build());
          } else {
              this.field = null;
@@ -117,5 +116,11 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
              ObjectActionProvider,
              ObjectActionParameterProvider {
          GqlvActionParam.Holder getHolder();
+
+         void addGqlArguments(
+                 ObjectAction objectAction,
+                 GraphQLFieldDefinition.Builder fieldBuilder,
+                 TypeMapper.InputContext inputContext,
+                 int paramNum);
      }
  }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
index 7373ba5eeb..d4e48be8f4 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
@@ -24,6 +24,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
  import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
  import org.apache.causeway.core.metamodel.object.ManagedObject;
+ import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
  import org.apache.causeway.viewer.graphql.model.context.Context;
  import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
@@ -39,8 +40,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
  import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
- import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
-
  @Log4j2
  public class GqlvActionParamDefault {
 
@@ -64,8 +63,8 @@ package org.apache.causeway.viewer.graphql.model.domain;
              val elementType = objectActionParameter.getElementType();
              val fieldBuilder = newFieldDefinition()
                      .name("default")
-                     .type(TypeMapper.outputTypeFor(elementType));
-             addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DEFAULT, holder.getParamNum());
+                     .type(context.typeMapper.outputTypeFor(elementType));
+             holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DEFAULT, holder.getParamNum());
              this.field = holder.addField(fieldBuilder.build());
          } else {
              this.field = null;
@@ -110,5 +109,11 @@ package org.apache.causeway.viewer.graphql.model.domain;
              ObjectActionProvider,
              ObjectActionParameterProvider {
          GqlvActionParam.Holder getHolder();
+
+         void addGqlArguments(
+                 ObjectAction objectAction,
+                 GraphQLFieldDefinition.Builder fieldBuilder,
+                 TypeMapper.InputContext inputContext,
+                 int paramNum);
      }
  }
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 2c9ffd4dd3..0819256aa3 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
@@ -20,6 +20,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 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.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
@@ -35,8 +36,6 @@ import graphql.schema.GraphQLFieldDefinition;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
-import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
-
 
 @Log4j2
 public class GqlvActionParamDisabled {
@@ -54,8 +53,8 @@ public class GqlvActionParamDisabled {
 
         val fieldBuilder = newFieldDefinition()
                 .name("disabled")
-                .type(TypeMapper.scalarTypeFor(String.class));
-        addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum()+1);
+                .type(context.typeMapper.scalarTypeFor(String.class));
+        holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum()+1);
         this.field = holder.addField(fieldBuilder.build());
     }
 
@@ -91,5 +90,10 @@ public class GqlvActionParamDisabled {
                     ObjectSpecificationProvider,
                     ObjectActionProvider,
                     ObjectActionParameterProvider {
+        void addGqlArguments(
+                ObjectAction objectAction,
+                GraphQLFieldDefinition.Builder fieldBuilder,
+                TypeMapper.InputContext inputContext,
+                int i);
     }
 }
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 8313450744..c412fe2b85 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
@@ -20,6 +20,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 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.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
@@ -27,8 +28,6 @@ import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
-import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArguments;
-
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -53,8 +52,8 @@ public class GqlvActionParamHidden {
 
         GraphQLFieldDefinition.Builder fieldBuilder = newFieldDefinition()
                 .name("hidden")
-                .type(TypeMapper.scalarTypeFor(boolean.class));
-        addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
+                .type(context.typeMapper.scalarTypeFor(boolean.class));
+        holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
         this.field = holder.addField(fieldBuilder.build());
     }
 
@@ -93,5 +92,10 @@ public class GqlvActionParamHidden {
                     ObjectSpecificationProvider,
                     ObjectActionProvider,
                     ObjectActionParameterProvider {
+        void addGqlArguments(
+                ObjectAction objectAction,
+                GraphQLFieldDefinition.Builder fieldBuilder,
+                TypeMapper.InputContext inputContext,
+                int paramNum);
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
index 53ee9cad3a..42d8537cc6 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
@@ -20,6 +20,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 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.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
@@ -27,8 +28,6 @@ import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
-import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvAction.addGqlArgument;
-
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -53,8 +52,8 @@ public class GqlvActionParamValidate {
 
         val fieldBuilder = newFieldDefinition()
                 .name("validity")
-                .type(TypeMapper.scalarTypeFor(String.class));
-        addGqlArgument(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
+                .type(context.typeMapper.scalarTypeFor(String.class));
+        holder.addGqlArgument(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
         this.field = holder.addField(fieldBuilder.build());
     }
 
@@ -93,5 +92,6 @@ public class GqlvActionParamValidate {
                     ObjectSpecificationProvider,
                     ObjectActionProvider,
                     ObjectActionParameterProvider {
+        void addGqlArgument(ObjectAction objectAction, 
GraphQLFieldDefinition.Builder fieldBuilder, TypeMapper.InputContext 
inputContext, int paramNum);
     }
 }
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 a51e461c40..28d39d1c60 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
@@ -25,6 +25,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojoFetcher;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
+import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
@@ -124,10 +125,21 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
         return FieldCoordinates.coordinates(gqlObjectType, fieldDefinition);
     }
 
+    @Override
+    public void addGqlArguments(
+            ObjectAction objectAction, GraphQLFieldDefinition.Builder 
fieldBuilder, TypeMapper.InputContext inputContext, int paramNum) {
+        holder.addGqlArguments(objectAction, fieldBuilder, inputContext, 
paramNum);
+    }
+
     public interface Holder
             extends GqlvHolder,
                     ObjectSpecificationProvider,
                     ObjectActionProvider {
 
+        void addGqlArguments(
+                ObjectAction objectAction,
+                GraphQLFieldDefinition.Builder fieldBuilder,
+                TypeMapper.InputContext inputContext,
+                int paramNum);
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
index bbff8d3fe3..64b58dc73e 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
@@ -58,18 +58,18 @@ public class GqlvActionValidity {
         this.field = fieldDefinition(holder);
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
+    private GraphQLFieldDefinition fieldDefinition(final Holder holder) {
 
         val objectAction = holder.getObjectAction();
 
         GraphQLFieldDefinition fieldDefinition = null;
-        GraphQLOutputType type = TypeMapper.scalarTypeFor(String.class);
+        GraphQLOutputType type = 
context.typeMapper.scalarTypeFor(String.class);
         if (type != null) {
             val fieldBuilder = newFieldDefinition()
                     .name("validate")
                     .type(type);
 
-            GqlvAction.addGqlArguments(objectAction, fieldBuilder, 
TypeMapper.InputContext.VALIDATE, objectAction.getParameterCount());
+            holder.addGqlArguments(objectAction, fieldBuilder, 
TypeMapper.InputContext.VALIDATE, objectAction.getParameterCount());
             fieldDefinition = fieldBuilder.build();
 
             holder.addField(fieldDefinition);
@@ -119,5 +119,10 @@ public class GqlvActionValidity {
             ObjectSpecificationProvider,
             ObjectActionProvider {
 
+        void addGqlArguments(
+                ObjectAction objectAction,
+                GraphQLFieldDefinition.Builder fieldBuilder,
+                TypeMapper.InputContext inputContext,
+                int parameterCount);
     }
 }
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 53d82b2e3c..d342ede8eb 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
@@ -39,7 +39,7 @@ public class GqlvCollectionGet extends 
GqlvAssociationGet<OneToManyAssociation>
     @Override
     GraphQLOutputType 
outputTypeFor(GqlvAssociationGet.Holder<OneToManyAssociation> holder) {
         val oneToManyAssociation = holder.getObjectAssociation();
-        return TypeMapper.listTypeForElementTypeOf(oneToManyAssociation);
+        return 
context.typeMapper.listTypeForElementTypeOf(oneToManyAssociation);
     }
 
     public interface Holder
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 549a7be4eb..d5d30ce9b0 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
@@ -26,7 +26,6 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -49,19 +48,11 @@ public class GqlvMemberDisabled<T extends ObjectMember> {
     ) {
         this.holder = holder;
         this.context = context;
-        this.field = fieldDefinition(holder);
-    }
-
-    private static GraphQLFieldDefinition fieldDefinition(final Holder holder) 
{
-
-        GraphQLFieldDefinition fieldDefinition =
-                newFieldDefinition()
-                    .name("disabled")
-                    .type(TypeMapper.scalarTypeFor(String.class))
-                    .build();
 
-        holder.addField(fieldDefinition);
-        return fieldDefinition;
+        this.field = holder.addField(newFieldDefinition()
+                .name("disabled")
+                .type(this.context.typeMapper.scalarTypeFor(String.class))
+                .build());
     }
 
     public void addDataFetcher() {
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 6fb6a7897f..ff391a45f5 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
@@ -26,7 +26,6 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -49,19 +48,11 @@ public class GqlvMemberHidden<T extends ObjectMember> {
     ) {
         this.holder = holder;
         this.context = context;
-        this.field = fieldDefinition(holder);
-    }
-
-    private static <T extends ObjectMember> GraphQLFieldDefinition 
fieldDefinition(final Holder<T> holder) {
-
-        GraphQLFieldDefinition fieldDefinition =
-                newFieldDefinition()
-                    .name("hidden")
-                    .type(TypeMapper.scalarTypeFor(boolean.class))
-                    .build();
 
-        holder.addField(fieldDefinition);
-        return fieldDefinition;
+        this.field = holder.addField(newFieldDefinition()
+                .name("hidden")
+                .type(this.context.typeMapper.scalarTypeFor(boolean.class))
+                .build());
     }
 
     public void addDataFetcher() {
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 140fda9278..f1e79a8983 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
@@ -87,19 +87,19 @@ public class GqlvProperty
         );
     }
 
-    static void addGqlArgument(
+    public void addGqlArgument(
             final OneToOneAssociation oneToOneAssociation,
             final GraphQLFieldDefinition.Builder builder,
             final TypeMapper.InputContext inputContext) {
         builder.argument(gqlArgumentFor(oneToOneAssociation, inputContext));
     }
 
-    private static GraphQLArgument gqlArgumentFor(
+    private GraphQLArgument gqlArgumentFor(
             final OneToOneAssociation oneToOneAssociation,
             final TypeMapper.InputContext inputContext) {
         return GraphQLArgument.newArgument()
                 .name(oneToOneAssociation.getId())
-                .type(TypeMapper.inputTypeFor(oneToOneAssociation, 
inputContext))
+                .type(context.typeMapper.inputTypeFor(oneToOneAssociation, 
inputContext))
                 .build();
     }
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
index b9d18d3bf5..79e48b6621 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
@@ -64,10 +64,10 @@ public class GqlvPropertyAutoComplete {
             val elementType = otoa.getElementType();
             val fieldBuilder = newFieldDefinition()
                     .name("autoComplete")
-                    
.type(GraphQLList.list(TypeMapper.outputTypeFor(elementType)));
+                    
.type(GraphQLList.list(context.typeMapper.outputTypeFor(elementType)));
             fieldBuilder.argument(GraphQLArgument.newArgument()
                             .name(SEARCH_PARAM_NAME)
-                            
.type(nonNull(TypeMapper.scalarTypeFor(String.class))))
+                            
.type(nonNull(context.typeMapper.scalarTypeFor(String.class))))
                     .build();
             this.field = holder.addField(fieldBuilder.build());
         } else {
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
index c63ad0aaa0..49320cf76c 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
@@ -19,14 +19,10 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
-import org.apache.causeway.commons.collections.Can;
-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.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
@@ -34,16 +30,13 @@ import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationP
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
-import graphql.schema.GraphQLList;
-
 import lombok.val;
 
 import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLOutputType;
+import graphql.schema.GraphQLList;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
-import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvProperty.addGqlArgument;
 
 public class GqlvPropertyChoices {
 
@@ -65,8 +58,8 @@ public class GqlvPropertyChoices {
             val elementType = otoa.getElementType();
             val fieldBuilder = newFieldDefinition()
                     .name("choices")
-                    
.type(GraphQLList.list(TypeMapper.outputTypeFor(elementType)));
-            addGqlArgument(otoa, fieldBuilder, 
TypeMapper.InputContext.CHOICES);
+                    
.type(GraphQLList.list(context.typeMapper.outputTypeFor(elementType)));
+            holder.addGqlArgument(otoa, fieldBuilder, 
TypeMapper.InputContext.CHOICES);
             this.field = holder.addField(fieldBuilder.build());
         } else {
             this.field = null;
@@ -118,5 +111,6 @@ public class GqlvPropertyChoices {
             ObjectSpecificationProvider,
             OneToOneAssociationProvider {
 
+        void addGqlArgument(OneToOneAssociation otoa, 
GraphQLFieldDefinition.Builder fieldBuilder, TypeMapper.InputContext 
inputContext);
     }
 }
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 25d207b60e..820df38fcf 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
@@ -39,7 +39,7 @@ public class GqlvPropertyGet  extends 
GqlvAssociationGet<OneToOneAssociation> {
     @Override
     GraphQLOutputType 
outputTypeFor(GqlvAssociationGet.Holder<OneToOneAssociation> holder) {
         val oneToOneAssociation = holder.getObjectAssociation();
-        return TypeMapper.outputTypeFor(oneToOneAssociation);
+        return context.typeMapper.outputTypeFor(oneToOneAssociation);
     }
 
     public interface Holder extends 
GqlvAssociationGet.Holder<OneToOneAssociation> {
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 b6da9eadb0..ef7854e6d9 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
@@ -22,6 +22,7 @@ import org.apache.causeway.applib.annotation.Where;
 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.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.exceptions.DisabledException;
 import org.apache.causeway.viewer.graphql.model.exceptions.HiddenException;
@@ -63,7 +64,7 @@ public class GqlvPropertySet {
             val fieldBuilder = newFieldDefinition()
                     .name("set")
                     .type(type);
-            GqlvProperty.addGqlArgument(holder.getOneToOneAssociation(), 
fieldBuilder, TypeMapper.InputContext.INVOKE);
+            holder.addGqlArgument(holder.getOneToOneAssociation(), 
fieldBuilder, TypeMapper.InputContext.INVOKE);
             fieldDefinition = fieldBuilder.build();
 
             holder.addField(fieldDefinition);
@@ -72,7 +73,7 @@ public class GqlvPropertySet {
     }
 
     GraphQLOutputType outputTypeFor(Holder holder) {
-        return TypeMapper.outputTypeFor(holder.getObjectSpecification());   // 
setters return void, so we return the domain object instead
+        return 
context.typeMapper.outputTypeFor(holder.getObjectSpecification());   // setters 
return void, so we return the domain object instead
     }
 
 
@@ -137,5 +138,6 @@ public class GqlvPropertySet {
             ObjectSpecificationProvider,
             OneToOneAssociationProvider {
 
+        void addGqlArgument(OneToOneAssociation oneToOneAssociation, 
GraphQLFieldDefinition.Builder fieldBuilder, TypeMapper.InputContext 
inputContext);
     }
 }
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 161a9cb22a..a75ceccde3 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.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
@@ -35,7 +36,6 @@ import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.GraphQLFieldDefinition;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
-import static 
org.apache.causeway.viewer.graphql.model.domain.GqlvProperty.addGqlArgument;
 
 public class GqlvPropertyValidate {
 
@@ -51,8 +51,8 @@ public class GqlvPropertyValidate {
 
         val fieldBuilder = newFieldDefinition()
                 .name("validate")
-                .type(TypeMapper.scalarTypeFor(String.class));
-        addGqlArgument(holder.getOneToOneAssociation(), fieldBuilder, 
TypeMapper.InputContext.VALIDATE);
+                .type(context.typeMapper.scalarTypeFor(String.class));
+        holder.addGqlArgument(holder.getOneToOneAssociation(), fieldBuilder, 
TypeMapper.InputContext.VALIDATE);
 
         this.field = holder.addField(fieldBuilder.build());
     }
@@ -100,5 +100,6 @@ public class GqlvPropertyValidate {
             ObjectSpecificationProvider,
             OneToOneAssociationProvider {
 
+        void addGqlArgument(OneToOneAssociation oneToOneAssociation, 
GraphQLFieldDefinition.Builder fieldBuilder, TypeMapper.InputContext 
inputContext);
     }
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
index a9fe26dc8d..0974757570 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/types/TypeMapper.java
@@ -27,8 +27,10 @@ import graphql.schema.*;
 
 import lombok.experimental.UtilityClass;
 
+import javax.annotation.Priority;
 import javax.ws.rs.NotSupportedException;
 
+import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.commons.internal.collections._Maps;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyActionParameter;
@@ -37,11 +39,13 @@ import 
org.apache.causeway.core.metamodel.spec.feature.OneToOneFeature;
 import org.apache.causeway.viewer.graphql.model.domain.TypeNames;
 
 import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Component;
 
 import static graphql.schema.GraphQLNonNull.nonNull;
 import static graphql.schema.GraphQLTypeReference.typeRef;
 
-@UtilityClass
+@Component
+@Priority(PriorityPrecedence.LATE)
 public class TypeMapper {
 
     private static <K,V> Map.Entry<K,V> pair(K key, V value) {
@@ -72,11 +76,11 @@ public class TypeMapper {
             pair(Boolean.class, Scalars.GraphQLBoolean)
     );
 
-    public static GraphQLScalarType scalarTypeFor(final Class<?> c){
+    public GraphQLScalarType scalarTypeFor(final Class<?> c){
         return SCALAR_BY_CLASS.getOrDefault(c, Scalars.GraphQLString);
     }
 
-    public static GraphQLOutputType outputTypeFor(final OneToOneFeature 
oneToOneFeature) {
+    public GraphQLOutputType outputTypeFor(final OneToOneFeature 
oneToOneFeature) {
         ObjectSpecification otoaObjectSpec = oneToOneFeature.getElementType();
         switch (otoaObjectSpec.getBeanSort()) {
 
@@ -100,7 +104,7 @@ public class TypeMapper {
     }
 
     @Nullable
-    public static GraphQLOutputType outputTypeFor(final ObjectSpecification 
objectSpecification){
+    public GraphQLOutputType outputTypeFor(final ObjectSpecification 
objectSpecification){
 
         switch (objectSpecification.getBeanSort()){
             case ABSTRACT:
@@ -121,23 +125,23 @@ public class TypeMapper {
         }
     }
 
-    @Nullable public static GraphQLList 
listTypeForElementTypeOf(OneToManyAssociation oneToManyAssociation) {
+    @Nullable public GraphQLList listTypeForElementTypeOf(OneToManyAssociation 
oneToManyAssociation) {
         ObjectSpecification elementType = 
oneToManyAssociation.getElementType();
-        return TypeMapper.listTypeFor(elementType);
+        return listTypeFor(elementType);
     }
 
-    @Nullable public static GraphQLList listTypeFor(ObjectSpecification 
elementType) {
+    @Nullable public GraphQLList listTypeFor(ObjectSpecification elementType) {
         switch (elementType.getBeanSort()) {
             case VIEW_MODEL:
             case ENTITY:
                 return 
GraphQLList.list(typeRef(TypeNames.objectTypeNameFor(elementType)));
             case VALUE:
-                return 
GraphQLList.list(TypeMapper.scalarTypeFor(elementType.getCorrespondingClass()));
+                return 
GraphQLList.list(scalarTypeFor(elementType.getCorrespondingClass()));
         }
         return null;
     }
 
-    public static GraphQLInputType inputTypeFor(
+    public GraphQLInputType inputTypeFor(
             final OneToOneFeature oneToOneFeature,
             final InputContext inputContext) {
         return oneToOneFeature.isOptional() || 
inputContext.isOptionalAlwaysAllowed()
@@ -145,7 +149,7 @@ public class TypeMapper {
                 : nonNull(inputTypeFor_(oneToOneFeature));
     }
 
-    private static GraphQLInputType inputTypeFor_(final OneToOneFeature 
oneToOneFeature){
+    private GraphQLInputType inputTypeFor_(final OneToOneFeature 
oneToOneFeature){
         ObjectSpecification elementType = oneToOneFeature.getElementType();
         switch (elementType.getBeanSort()) {
             case ABSTRACT:
@@ -164,12 +168,12 @@ public class TypeMapper {
         }
     }
 
-    public static GraphQLList inputTypeFor(final OneToManyActionParameter 
oneToManyActionParameter, final InputContext inputContextUnused){
+    public GraphQLList inputTypeFor(final OneToManyActionParameter 
oneToManyActionParameter, final InputContext inputContextUnused){
         ObjectSpecification elementType = 
oneToManyActionParameter.getElementType();
-        return GraphQLList.list(TypeMapper.inputTypeFor_(elementType));
+        return GraphQLList.list(inputTypeFor_(elementType));
     }
 
-    private static GraphQLInputType inputTypeFor_(final ObjectSpecification 
elementType){
+    private GraphQLInputType inputTypeFor_(final ObjectSpecification 
elementType){
         switch (elementType.getBeanSort()) {
             case ABSTRACT:
             case ENTITY:
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
index 75400121b9..471a3254c0 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Calculator.java
@@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
+import java.util.List;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -13,6 +14,8 @@ import javax.inject.Named;
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainService;
 import org.apache.causeway.applib.annotation.NatureOfService;
+import org.apache.causeway.applib.annotation.Optionality;
+import org.apache.causeway.applib.annotation.Parameter;
 import org.apache.causeway.applib.annotation.PriorityPrecedence;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
@@ -22,29 +25,64 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class Calculator {
 
+    @Action(semantics = SemanticsOf.SAFE)
+    public byte addBytes(byte x, byte y) {
+        return (byte)(x+y);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public int addByteWrappers(Byte x, @Parameter(optionality = 
Optionality.OPTIONAL) Byte y) {
+        return y != null ? x+y : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public short addShorts(short x, short y) {
+        return (short)(x+y);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public Short addShortWrappers(Short x, @Parameter(optionality = 
Optionality.OPTIONAL) Short y) {
+        return y != null ? (short)(x+y) : x;
+    }
+
     @Action(semantics = SemanticsOf.SAFE)
     public int addIntegers(int x, int y) {
         return x+y;
     }
 
+    @Action(semantics = SemanticsOf.SAFE)
+    public int addIntegerWrappers(Integer x, @Parameter(optionality = 
Optionality.OPTIONAL) Integer y) {
+        return y != null ? x+y : x;
+    }
+
     @Action(semantics = SemanticsOf.SAFE)
     public double addDoubles(double x, double y) {
         return x+y;
     }
 
+    @Action(semantics = SemanticsOf.SAFE)
+    public Double addDoubleWrappers(Double x, @Parameter(optionality = 
Optionality.OPTIONAL) Double y) {
+        return y != null ? x+y : x;
+    }
+
     @Action(semantics = SemanticsOf.SAFE)
     public float addFloats(float x, float y) {
         return x+y;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public BigInteger addBigIntegers(BigInteger x, BigInteger y) {
-        return x.add(y);
+    public Float addFloatWrappers(Float x, @Parameter(optionality = 
Optionality.OPTIONAL) Float y) {
+        return y != null ? (float)(x+y) : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public BigInteger addBigIntegers(BigInteger x, @Parameter(optionality = 
Optionality.OPTIONAL) BigInteger y) {
+        return y != null ? x.add(y) : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
-    public BigDecimal addBigDecimals(BigDecimal x, BigDecimal y) {
-        return x.add(y);
+    public BigDecimal addBigDecimals(BigDecimal x, @Parameter(optionality = 
Optionality.OPTIONAL) BigDecimal y) {
+        return y != null ? x.add(y) : x;
     }
 
     @Action(semantics = SemanticsOf.SAFE)
@@ -52,6 +90,11 @@ public class Calculator {
         return date.plusDays(numDays);
     }
 
+    @Action(semantics = SemanticsOf.SAFE)
+    public org.joda.time.LocalDate plusJodaDays(org.joda.time.LocalDate date, 
int numDays) {
+        return date.plusDays(numDays);
+    }
+
     @Action(semantics = SemanticsOf.SAFE)
     public boolean and(boolean x, boolean y) {
         return x & y;
@@ -67,4 +110,14 @@ public class Calculator {
         return !x;
     }
 
+    @Action(semantics = SemanticsOf.SAFE)
+    public Month nextMonth(Month month) {
+        return month.nextMonth();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public String concat(String prefix, @Parameter(optionality = 
Optionality.OPTIONAL) String suffix) {
+        return prefix + suffix;
+    }
+
 }
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Month.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Month.java
new file mode 100644
index 0000000000..1aae20a304
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Month.java
@@ -0,0 +1,23 @@
+package org.apache.causeway.viewer.graphql.viewer.test.domain.calc;
+
+public enum Month {
+    JANUARY,
+    FEBRUARY,
+    MARCH,
+    APRIL,
+    MAY,
+    JUNE,
+    JULY,
+    AUGUST,
+    SEPTEMBER,
+    OCTOBER,
+    NOVEMBER,
+    DECEMBER,
+    ;
+
+    public Month nextMonth() {
+        int currentMonthOrdinal = this.ordinal();
+        int nextMonthOrdinal = (currentMonthOrdinal + 1) % 
Month.values().length;
+        return Month.values()[nextMonthOrdinal];
+    }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Month_Test.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Month_Test.java
new file mode 100644
index 0000000000..38982a992b
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/Month_Test.java
@@ -0,0 +1,15 @@
+package org.apache.causeway.viewer.graphql.viewer.test.domain.calc;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class Month_Test {
+
+    @Test
+    public void testNextMonth() {
+        assertThat(Month.JANUARY.nextMonth()).isEqualTo(Month.FEBRUARY);
+        assertThat(Month.DECEMBER.nextMonth()).isEqualTo(Month.JANUARY);
+    }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_decimals.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_decimals.approved.json
index e69de29bb2..581e0722f3 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_decimals.approved.json
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_decimals.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "addBigIntegers" : {
+        "invoke" : 3
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_integers.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_integers.approved.json
index e69de29bb2..581e0722f3 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_integers.approved.json
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_big_integers.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "addBigIntegers" : {
+        "invoke" : 3
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_double_wrappers._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_double_wrappers._.gql
new file mode 100644
index 0000000000..6d78323837
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_double_wrappers._.gql
@@ -0,0 +1,7 @@
+{
+  university_calc_Calculator {
+    addDoubleWrappers {
+      invoke(x: 1.1, y: 2.2)
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_double_wrappers.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_double_wrappers.approved.json
new file mode 100644
index 0000000000..11350c5620
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_double_wrappers.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "addDoubleWrappers" : {
+        "invoke" : 3.3000000000000003
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_float_wrappers._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_float_wrappers._.gql
new file mode 100644
index 0000000000..2e53e03d84
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_float_wrappers._.gql
@@ -0,0 +1,7 @@
+{
+  university_calc_Calculator {
+    addFloatWrappers {
+      invoke(x: 1.1, y: 2.2)
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_float_wrappers.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_float_wrappers.approved.json
new file mode 100644
index 0000000000..5b60382a17
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_float_wrappers.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "addFloatWrappers" : {
+        "invoke" : 3.3000002
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_floats.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_floats.approved.json
index e69de29bb2..7562f94585 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_floats.approved.json
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_floats.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "addFloats" : {
+        "invoke" : 3.3000002
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_integer_wrappers._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_integer_wrappers._.gql
new file mode 100644
index 0000000000..0764ecd5c9
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_integer_wrappers._.gql
@@ -0,0 +1,7 @@
+{
+  university_calc_Calculator {
+    addIntegerWrappers {
+      invoke(x: 1, y: 2)
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_integer_wrappers.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_integer_wrappers.approved.json
new file mode 100644
index 0000000000..86372e9bc1
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.add_integer_wrappers.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "addIntegerWrappers" : {
+        "invoke" : 3
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.concat._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.concat._.gql
new file mode 100644
index 0000000000..3d71f77177
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.concat._.gql
@@ -0,0 +1,7 @@
+{
+  university_calc_Calculator {
+    concat {
+      invoke(prefix: "Fizz", suffix: "Buzz")
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.concat.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.concat.approved.json
new file mode 100644
index 0000000000..04f843578d
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.concat.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "concat" : {
+        "invoke" : "FizzBuzz"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.java
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.java
index b65b0e0a81..b39ba8781e 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.java
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.java
@@ -41,6 +41,14 @@ public class Calculator_IntegTest extends Abstract_IntegTest 
{
         Approvals.verify(submit(), jsonOptions());
     }
 
+    @Test
+    @UseReporter(DiffReporter.class)
+    void add_integer_wrappers() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+    }
+
     @Test
     @UseReporter(DiffReporter.class)
     void add_doubles() throws Exception {
@@ -50,7 +58,14 @@ public class Calculator_IntegTest extends Abstract_IntegTest 
{
     }
 
     @Test
-    @Disabled // not yet supported ... receives java.lang.Double
+    @UseReporter(DiffReporter.class)
+    void add_double_wrappers() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+    }
+
+    @Test
     @UseReporter(DiffReporter.class)
     void add_floats() throws Exception {
 
@@ -59,7 +74,14 @@ public class Calculator_IntegTest extends Abstract_IntegTest 
{
     }
 
     @Test
-    @Disabled // not yet supported ... receives java.lang.Integer
+    @UseReporter(DiffReporter.class)
+    void add_float_wrappers() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+    }
+
+    @Test
     @UseReporter(DiffReporter.class)
     void add_big_integers() throws Exception {
 
@@ -68,7 +90,6 @@ public class Calculator_IntegTest extends Abstract_IntegTest {
     }
 
     @Test
-    @Disabled // not yet supported ... receives java.lang.Double
     @UseReporter(DiffReporter.class)
     void add_big_decimals() throws Exception {
 
@@ -77,7 +98,6 @@ public class Calculator_IntegTest extends Abstract_IntegTest {
     }
 
     @Test
-    @Disabled // not yet supported ... receives java.lang.String
     @UseReporter(DiffReporter.class)
     void plus_days() throws Exception {
 
@@ -85,6 +105,14 @@ public class Calculator_IntegTest extends 
Abstract_IntegTest {
         Approvals.verify(submit(), jsonOptions());
     }
 
+    @Test
+    @UseReporter(DiffReporter.class)
+    void plus_joda_days() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+    }
+
     @Test
     @UseReporter(DiffReporter.class)
     void boolean_and_1() throws Exception {
@@ -129,5 +157,23 @@ public class Calculator_IntegTest extends 
Abstract_IntegTest {
 
     }
 
+    @Test
+    @UseReporter(DiffReporter.class)
+    void next_month() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+
+    }
+
+    @Test
+    @UseReporter(DiffReporter.class)
+    void concat() throws Exception {
+
+        // when, then
+        Approvals.verify(submit(), jsonOptions());
+
+    }
+
 
 }
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.next_month._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.next_month._.gql
new file mode 100644
index 0000000000..70d396c2bf
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.next_month._.gql
@@ -0,0 +1,7 @@
+{
+  university_calc_Calculator {
+    nextMonth {
+      invoke(month: "JUNE")
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.next_month.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.next_month.approved.json
new file mode 100644
index 0000000000..7b37fa5852
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.next_month.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "nextMonth" : {
+        "invoke" : "JULY"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_days.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_days.approved.json
index e69de29bb2..d2f25092c2 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_days.approved.json
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_days.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "plusDays" : {
+        "invoke" : "2024-01-28"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_joda_days._.gql
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_joda_days._.gql
new file mode 100644
index 0000000000..61b56a4184
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_joda_days._.gql
@@ -0,0 +1,7 @@
+{
+  university_calc_Calculator {
+    plusJodaDays {
+      invoke(date: "2024-01-26", numDays: 2)
+    }
+  }
+}
diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_joda_days.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_joda_days.approved.json
new file mode 100644
index 0000000000..6d1ebd29b8
--- /dev/null
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Calculator_IntegTest.plus_joda_days.approved.json
@@ -0,0 +1,9 @@
+{
+  "data" : {
+    "university_calc_Calculator" : {
+      "plusJodaDays" : {
+        "invoke" : "2024-01-28"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/test/src/test/resources/application-test.properties 
b/incubator/viewers/graphql/test/src/test/resources/application-test.properties
index 54fc4d657b..1ed5bab4ab 100644
--- 
a/incubator/viewers/graphql/test/src/test/resources/application-test.properties
+++ 
b/incubator/viewers/graphql/test/src/test/resources/application-test.properties
@@ -1,3 +1,3 @@
-#logging.level.org.springframework=DEBUG
-#logging.level.graphql=DEBUG
+logging.level.org.springframework=DEBUG
+logging.level.graphql=DEBUG
 
diff --git a/incubator/viewers/graphql/test/src/test/resources/schema.gql 
b/incubator/viewers/graphql/test/src/test/resources/schema.gql
index c04ef7772d..65f5d13da4 100644
--- a/incubator/viewers/graphql/test/src/test/resources/schema.gql
+++ b/incubator/viewers/graphql/test/src/test/resources/schema.gql
@@ -1288,13 +1288,13 @@ type 
org_apache_causeway_commons_functional_Either__accept__gqlv_action_params {
 type 
org_apache_causeway_commons_functional_Either__accept__leftConsumer__gqlv_action_parameter
 {
   disabled(leftConsumer: java_util_function_Consumer__gqlv_input): String
   hidden: Boolean
-  validity(leftConsumer: java_util_function_Consumer__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Either__accept__rightConsumer__gqlv_action_parameter
 {
   disabled(leftConsumer: java_util_function_Consumer__gqlv_input, 
rightConsumer: java_util_function_Consumer__gqlv_input): String
   hidden(leftConsumer: java_util_function_Consumer__gqlv_input): Boolean
-  validity(rightConsumer: java_util_function_Consumer__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Either__gqlv_meta {
@@ -1324,7 +1324,7 @@ type 
org_apache_causeway_commons_functional_Either__mapLeft__gqlv_action_params
 type 
org_apache_causeway_commons_functional_Either__mapLeft__leftMapper__gqlv_action_parameter
 {
   disabled(leftMapper: java_util_function_Function__gqlv_input): String
   hidden: Boolean
-  validity(leftMapper: java_util_function_Function__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Either__mapRight__gqlv_action {
@@ -1342,7 +1342,7 @@ type 
org_apache_causeway_commons_functional_Either__mapRight__gqlv_action_params
 type 
org_apache_causeway_commons_functional_Either__mapRight__rightMapper__gqlv_action_parameter
 {
   disabled(rightMapper: java_util_function_Function__gqlv_input): String
   hidden: Boolean
-  validity(rightMapper: java_util_function_Function__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Either__map__gqlv_action {
@@ -1361,13 +1361,13 @@ type 
org_apache_causeway_commons_functional_Either__map__gqlv_action_params {
 type 
org_apache_causeway_commons_functional_Either__map__leftMapper__gqlv_action_parameter
 {
   disabled(leftMapper: java_util_function_Function__gqlv_input): String
   hidden: Boolean
-  validity(leftMapper: java_util_function_Function__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Either__map__rightMapper__gqlv_action_parameter
 {
   disabled(leftMapper: java_util_function_Function__gqlv_input, rightMapper: 
java_util_function_Function__gqlv_input): String
   hidden(leftMapper: java_util_function_Function__gqlv_input): Boolean
-  validity(rightMapper: java_util_function_Function__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Either__right__gqlv_action {
@@ -1391,7 +1391,7 @@ type org_apache_causeway_commons_functional_Railway {
 type 
org_apache_causeway_commons_functional_Railway__chain__chainingFunction__gqlv_action_parameter
 {
   disabled(chainingFunction: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(chainingFunction: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Railway__chain__gqlv_action {
@@ -1422,7 +1422,7 @@ type 
org_apache_causeway_commons_functional_Railway__gqlv_meta {
 type 
org_apache_causeway_commons_functional_Railway__ifFailure__failureConsumer__gqlv_action_parameter
 {
   disabled(failureConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden: Boolean
-  validity(failureConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Railway__ifFailure__gqlv_action {
@@ -1452,13 +1452,13 @@ type 
org_apache_causeway_commons_functional_Railway__ifSuccess__gqlv_action_para
 type 
org_apache_causeway_commons_functional_Railway__ifSuccess__successConsumer__gqlv_action_parameter
 {
   disabled(successConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden: Boolean
-  validity(successConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Railway__mapFailure__failureMapper__gqlv_action_parameter
 {
   disabled(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Railway__mapFailure__gqlv_action {
@@ -1488,7 +1488,7 @@ type 
org_apache_causeway_commons_functional_Railway__mapSuccess__gqlv_action_par
 type 
org_apache_causeway_commons_functional_Railway__mapSuccess__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Railway__success__gqlv_property {
@@ -1508,7 +1508,7 @@ type 
org_apache_causeway_commons_functional_ThrowingConsumer {
 type 
org_apache_causeway_commons_functional_ThrowingConsumer__andThen__arg0__gqlv_action_parameter
 {
   disabled(arg0: java_util_function_Consumer__gqlv_input): String
   hidden: Boolean
-  validity(arg0: java_util_function_Consumer__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_ThrowingConsumer__andThen__gqlv_action {
@@ -1531,7 +1531,7 @@ type 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_meta {
 type 
org_apache_causeway_commons_functional_ThrowingConsumer__throwing__exceptionWrapper__gqlv_action_parameter
 {
   disabled(exceptionWrapper: java_util_function_BiFunction__gqlv_input): String
   hidden: Boolean
-  validity(exceptionWrapper: java_util_function_BiFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_ThrowingConsumer__throwing__gqlv_action {
@@ -1556,7 +1556,7 @@ type 
org_apache_causeway_commons_functional_ThrowingFunction {
 type 
org_apache_causeway_commons_functional_ThrowingFunction__andThen__arg0__gqlv_action_parameter
 {
   disabled(arg0: java_util_function_Function__gqlv_input): String
   hidden: Boolean
-  validity(arg0: java_util_function_Function__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_ThrowingFunction__andThen__gqlv_action {
@@ -1574,7 +1574,7 @@ type 
org_apache_causeway_commons_functional_ThrowingFunction__andThen__gqlv_acti
 type 
org_apache_causeway_commons_functional_ThrowingFunction__compose__arg0__gqlv_action_parameter
 {
   disabled(arg0: java_util_function_Function__gqlv_input): String
   hidden: Boolean
-  validity(arg0: java_util_function_Function__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_ThrowingFunction__compose__gqlv_action {
@@ -1597,7 +1597,7 @@ type 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_meta {
 type 
org_apache_causeway_commons_functional_ThrowingFunction__throwing__exceptionWrapper__gqlv_action_parameter
 {
   disabled(exceptionWrapper: java_util_function_BiFunction__gqlv_input): String
   hidden: Boolean
-  validity(exceptionWrapper: java_util_function_BiFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_ThrowingFunction__throwing__gqlv_action {
@@ -1691,7 +1691,7 @@ type org_apache_causeway_commons_functional_Try {
 type 
org_apache_causeway_commons_functional_Try__accept__failureConsumer__gqlv_action_parameter
 {
   disabled(failureConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden: Boolean
-  validity(failureConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__accept__gqlv_action {
@@ -1710,7 +1710,7 @@ type 
org_apache_causeway_commons_functional_Try__accept__gqlv_action_params {
 type 
org_apache_causeway_commons_functional_Try__accept__successConsumer__gqlv_action_parameter
 {
   disabled(failureConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input, 
successConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden(failureConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): Boolean
-  validity(successConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__failure__gqlv_property {
@@ -1736,7 +1736,7 @@ type 
org_apache_causeway_commons_functional_Try__flatMapSuccessAsNullable__gqlv_
 type 
org_apache_causeway_commons_functional_Try__flatMapSuccessAsNullable__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Try__flatMapSuccessWhenPresent__gqlv_action
 {
@@ -1754,7 +1754,7 @@ type 
org_apache_causeway_commons_functional_Try__flatMapSuccessWhenPresent__gqlv
 type 
org_apache_causeway_commons_functional_Try__flatMapSuccessWhenPresent__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__flatMapSuccess__gqlv_action {
@@ -1772,7 +1772,7 @@ type 
org_apache_causeway_commons_functional_Try__flatMapSuccess__gqlv_action_par
 type 
org_apache_causeway_commons_functional_Try__flatMapSuccess__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__gqlv_meta {
@@ -1797,7 +1797,7 @@ type 
org_apache_causeway_commons_functional_Try__ifFailureFail__gqlv_action {
 type 
org_apache_causeway_commons_functional_Try__ifFailure__exceptionConsumer__gqlv_action_parameter
 {
   disabled(exceptionConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden: Boolean
-  validity(exceptionConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__ifFailure__gqlv_action {
@@ -1827,7 +1827,7 @@ type 
org_apache_causeway_commons_functional_Try__ifSuccessAsNullable__gqlv_actio
 type 
org_apache_causeway_commons_functional_Try__ifSuccessAsNullable__valueConsumer__gqlv_action_parameter
 {
   disabled(valueConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden: Boolean
-  validity(valueConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__ifSuccess__gqlv_action {
@@ -1845,7 +1845,7 @@ type 
org_apache_causeway_commons_functional_Try__ifSuccess__gqlv_action_params {
 type 
org_apache_causeway_commons_functional_Try__ifSuccess__valueConsumer__gqlv_action_parameter
 {
   disabled(valueConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
   hidden: Boolean
-  validity(valueConsumer: 
org_apache_causeway_commons_functional_ThrowingConsumer__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Try__mapEmptyToFailure__gqlv_action {
@@ -1870,13 +1870,13 @@ type 
org_apache_causeway_commons_functional_Try__mapFailureToSuccess__gqlv_actio
 type 
org_apache_causeway_commons_functional_Try__mapFailureToSuccess__recoveryMapper__gqlv_action_parameter
 {
   disabled(recoveryMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(recoveryMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Try__mapFailure__failureMapper__gqlv_action_parameter
 {
   disabled(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__mapFailure__gqlv_action {
@@ -1906,7 +1906,7 @@ type 
org_apache_causeway_commons_functional_Try__mapSuccessAsNullable__gqlv_acti
 type 
org_apache_causeway_commons_functional_Try__mapSuccessAsNullable__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Try__mapSuccessWhenPresent__gqlv_action {
@@ -1924,7 +1924,7 @@ type 
org_apache_causeway_commons_functional_Try__mapSuccessWhenPresent__gqlv_act
 type 
org_apache_causeway_commons_functional_Try__mapSuccessWhenPresent__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__mapSuccess__gqlv_action {
@@ -1942,13 +1942,13 @@ type 
org_apache_causeway_commons_functional_Try__mapSuccess__gqlv_action_params
 type 
org_apache_causeway_commons_functional_Try__mapSuccess__successMapper__gqlv_action_parameter
 {
   disabled(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Try__mapToEither__failureMapper__gqlv_action_parameter
 {
   disabled(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden: Boolean
-  validity(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__mapToEither__gqlv_action {
@@ -1967,13 +1967,13 @@ type 
org_apache_causeway_commons_functional_Try__mapToEither__gqlv_action_params
 type 
org_apache_causeway_commons_functional_Try__mapToEither__successMapper__gqlv_action_parameter
 {
   disabled(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input, 
successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
   hidden(failureMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): Boolean
-  validity(successMapper: 
org_apache_causeway_commons_functional_ThrowingFunction__gqlv_input): String
+  validity: String
 }
 
 type 
org_apache_causeway_commons_functional_Try__orCall__fallback__gqlv_action_parameter
 {
   disabled(fallback: java_util_concurrent_Callable__gqlv_input): String
   hidden: Boolean
-  validity(fallback: java_util_concurrent_Callable__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__orCall__gqlv_action {
@@ -1999,7 +1999,7 @@ type 
org_apache_causeway_commons_functional_Try__success__gqlv_property {
 type 
org_apache_causeway_commons_functional_Try__thenCall__callable__gqlv_action_parameter
 {
   disabled(callable: java_util_concurrent_Callable__gqlv_input): String
   hidden: Boolean
-  validity(callable: java_util_concurrent_Callable__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__thenCall__gqlv_action {
@@ -2029,7 +2029,7 @@ type 
org_apache_causeway_commons_functional_Try__thenRun__gqlv_action_params {
 type 
org_apache_causeway_commons_functional_Try__thenRun__runnable__gqlv_action_parameter
 {
   disabled(runnable: 
org_apache_causeway_commons_functional_ThrowingRunnable__gqlv_input): String
   hidden: Boolean
-  validity(runnable: 
org_apache_causeway_commons_functional_ThrowingRunnable__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__then__gqlv_action {
@@ -2047,7 +2047,7 @@ type 
org_apache_causeway_commons_functional_Try__then__gqlv_action_params {
 type 
org_apache_causeway_commons_functional_Try__then__next__gqlv_action_parameter {
   disabled(next: java_util_concurrent_Callable__gqlv_input): String
   hidden: Boolean
-  validity(next: java_util_concurrent_Callable__gqlv_input): String
+  validity: String
 }
 
 type org_apache_causeway_commons_functional_Try__value__gqlv_property {
@@ -2158,7 +2158,7 @@ type university_admin_AdminMenu {
 type 
university_admin_AdminMenu__actionWithDisabledParam__firstParam__gqlv_action_parameter
 {
   disabled(firstParam: String): String
   hidden: Boolean
-  validity(firstParam: String): String
+  validity: String
 }
 
 type university_admin_AdminMenu__actionWithDisabledParam__gqlv_action {
@@ -2178,19 +2178,19 @@ type 
university_admin_AdminMenu__actionWithDisabledParam__gqlv_action_params {
 type 
university_admin_AdminMenu__actionWithDisabledParam__secondParam__gqlv_action_parameter
 {
   disabled(firstParam: String, secondParam: String): String
   hidden(firstParam: String): Boolean
-  validity(secondParam: String): String
+  validity: String
 }
 
 type 
university_admin_AdminMenu__actionWithDisabledParam__thirdParameter__gqlv_action_parameter
 {
   disabled(firstParam: String, secondParam: String, thirdParameter: String): 
String
   hidden(firstParam: String, secondParam: String): Boolean
-  validity(thirdParameter: String): String
+  validity: String
 }
 
 type 
university_admin_AdminMenu__actionWithHiddenParam__firstParam__gqlv_action_parameter
 {
   disabled(firstParam: String): String
   hidden: Boolean
-  validity(firstParam: String): String
+  validity: String
 }
 
 type university_admin_AdminMenu__actionWithHiddenParam__gqlv_action {
@@ -2209,7 +2209,7 @@ type 
university_admin_AdminMenu__actionWithHiddenParam__gqlv_action_params {
 type 
university_admin_AdminMenu__actionWithHiddenParam__secondParam__gqlv_action_parameter
 {
   disabled(firstParam: String, secondParam: String): String
   hidden(firstParam: String): Boolean
-  validity(secondParam: String): String
+  validity: String
 }
 
 type university_admin_AdminMenu__adminAction__gqlv_action {
@@ -2229,19 +2229,29 @@ type 
university_admin_AdminMenu__otherAdminAction__gqlv_action {
 type university_calc_Calculator {
   addBigDecimals: university_calc_Calculator__addBigDecimals__gqlv_action
   addBigIntegers: university_calc_Calculator__addBigIntegers__gqlv_action
+  addByteWrappers: university_calc_Calculator__addByteWrappers__gqlv_action
+  addBytes: university_calc_Calculator__addBytes__gqlv_action
+  addDoubleWrappers: university_calc_Calculator__addDoubleWrappers__gqlv_action
   addDoubles: university_calc_Calculator__addDoubles__gqlv_action
+  addFloatWrappers: university_calc_Calculator__addFloatWrappers__gqlv_action
   addFloats: university_calc_Calculator__addFloats__gqlv_action
+  addIntegerWrappers: 
university_calc_Calculator__addIntegerWrappers__gqlv_action
   addIntegers: university_calc_Calculator__addIntegers__gqlv_action
+  addShortWrappers: university_calc_Calculator__addShortWrappers__gqlv_action
+  addShorts: university_calc_Calculator__addShorts__gqlv_action
   and: university_calc_Calculator__and__gqlv_action
+  concat: university_calc_Calculator__concat__gqlv_action
+  nextMonth: university_calc_Calculator__nextMonth__gqlv_action
   not: university_calc_Calculator__not__gqlv_action
   or: university_calc_Calculator__or__gqlv_action
   plusDays: university_calc_Calculator__plusDays__gqlv_action
+  plusJodaDays: university_calc_Calculator__plusJodaDays__gqlv_action
 }
 
 type university_calc_Calculator__addBigDecimals__gqlv_action {
   disabled: String
   hidden: Boolean
-  invoke(x: Float!, y: Float!): Float
+  invoke(x: Float!, y: Float): Float
   params: university_calc_Calculator__addBigDecimals__gqlv_action_params
   validate(x: Float, y: Float): String
 }
@@ -2254,19 +2264,19 @@ type 
university_calc_Calculator__addBigDecimals__gqlv_action_params {
 type university_calc_Calculator__addBigDecimals__x__gqlv_action_parameter {
   disabled(x: Float): String
   hidden: Boolean
-  validity(x: Float): String
+  validity: String
 }
 
 type university_calc_Calculator__addBigDecimals__y__gqlv_action_parameter {
   disabled(x: Float, y: Float): String
   hidden(x: Float): Boolean
-  validity(y: Float): String
+  validity: String
 }
 
 type university_calc_Calculator__addBigIntegers__gqlv_action {
   disabled: String
   hidden: Boolean
-  invoke(x: Int!, y: Int!): Int
+  invoke(x: Int!, y: Int): Int
   params: university_calc_Calculator__addBigIntegers__gqlv_action_params
   validate(x: Int, y: Int): String
 }
@@ -2279,13 +2289,88 @@ type 
university_calc_Calculator__addBigIntegers__gqlv_action_params {
 type university_calc_Calculator__addBigIntegers__x__gqlv_action_parameter {
   disabled(x: Int): String
   hidden: Boolean
-  validity(x: Int): String
+  validity: String
 }
 
 type university_calc_Calculator__addBigIntegers__y__gqlv_action_parameter {
   disabled(x: Int, y: Int): String
   hidden(x: Int): Boolean
-  validity(y: Int): String
+  validity: String
+}
+
+type university_calc_Calculator__addByteWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: String!, y: String): Int
+  params: university_calc_Calculator__addByteWrappers__gqlv_action_params
+  validate(x: String, y: String): String
+}
+
+type university_calc_Calculator__addByteWrappers__gqlv_action_params {
+  x: university_calc_Calculator__addByteWrappers__x__gqlv_action_parameter
+  y: university_calc_Calculator__addByteWrappers__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addByteWrappers__x__gqlv_action_parameter {
+  disabled(x: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addByteWrappers__y__gqlv_action_parameter {
+  disabled(x: String, y: String): String
+  hidden(x: String): Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addBytes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: String!, y: String!): String
+  params: university_calc_Calculator__addBytes__gqlv_action_params
+  validate(x: String, y: String): String
+}
+
+type university_calc_Calculator__addBytes__gqlv_action_params {
+  x: university_calc_Calculator__addBytes__x__gqlv_action_parameter
+  y: university_calc_Calculator__addBytes__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addBytes__x__gqlv_action_parameter {
+  disabled(x: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addBytes__y__gqlv_action_parameter {
+  disabled(x: String, y: String): String
+  hidden(x: String): Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addDoubleWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Float!, y: Float): Float
+  params: university_calc_Calculator__addDoubleWrappers__gqlv_action_params
+  validate(x: Float, y: Float): String
+}
+
+type university_calc_Calculator__addDoubleWrappers__gqlv_action_params {
+  x: university_calc_Calculator__addDoubleWrappers__x__gqlv_action_parameter
+  y: university_calc_Calculator__addDoubleWrappers__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addDoubleWrappers__x__gqlv_action_parameter {
+  disabled(x: Float): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addDoubleWrappers__y__gqlv_action_parameter {
+  disabled(x: Float, y: Float): String
+  hidden(x: Float): Boolean
+  validity: String
 }
 
 type university_calc_Calculator__addDoubles__gqlv_action {
@@ -2304,13 +2389,38 @@ type 
university_calc_Calculator__addDoubles__gqlv_action_params {
 type university_calc_Calculator__addDoubles__x__gqlv_action_parameter {
   disabled(x: Float): String
   hidden: Boolean
-  validity(x: Float): String
+  validity: String
 }
 
 type university_calc_Calculator__addDoubles__y__gqlv_action_parameter {
   disabled(x: Float, y: Float): String
   hidden(x: Float): Boolean
-  validity(y: Float): String
+  validity: String
+}
+
+type university_calc_Calculator__addFloatWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Float!, y: Float): Float
+  params: university_calc_Calculator__addFloatWrappers__gqlv_action_params
+  validate(x: Float, y: Float): String
+}
+
+type university_calc_Calculator__addFloatWrappers__gqlv_action_params {
+  x: university_calc_Calculator__addFloatWrappers__x__gqlv_action_parameter
+  y: university_calc_Calculator__addFloatWrappers__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addFloatWrappers__x__gqlv_action_parameter {
+  disabled(x: Float): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addFloatWrappers__y__gqlv_action_parameter {
+  disabled(x: Float, y: Float): String
+  hidden(x: Float): Boolean
+  validity: String
 }
 
 type university_calc_Calculator__addFloats__gqlv_action {
@@ -2329,13 +2439,38 @@ type 
university_calc_Calculator__addFloats__gqlv_action_params {
 type university_calc_Calculator__addFloats__x__gqlv_action_parameter {
   disabled(x: Float): String
   hidden: Boolean
-  validity(x: Float): String
+  validity: String
 }
 
 type university_calc_Calculator__addFloats__y__gqlv_action_parameter {
   disabled(x: Float, y: Float): String
   hidden(x: Float): Boolean
-  validity(y: Float): String
+  validity: String
+}
+
+type university_calc_Calculator__addIntegerWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Int!, y: Int): Int
+  params: university_calc_Calculator__addIntegerWrappers__gqlv_action_params
+  validate(x: Int, y: Int): String
+}
+
+type university_calc_Calculator__addIntegerWrappers__gqlv_action_params {
+  x: university_calc_Calculator__addIntegerWrappers__x__gqlv_action_parameter
+  y: university_calc_Calculator__addIntegerWrappers__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addIntegerWrappers__x__gqlv_action_parameter {
+  disabled(x: Int): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addIntegerWrappers__y__gqlv_action_parameter {
+  disabled(x: Int, y: Int): String
+  hidden(x: Int): Boolean
+  validity: String
 }
 
 type university_calc_Calculator__addIntegers__gqlv_action {
@@ -2354,13 +2489,63 @@ type 
university_calc_Calculator__addIntegers__gqlv_action_params {
 type university_calc_Calculator__addIntegers__x__gqlv_action_parameter {
   disabled(x: Int): String
   hidden: Boolean
-  validity(x: Int): String
+  validity: String
 }
 
 type university_calc_Calculator__addIntegers__y__gqlv_action_parameter {
   disabled(x: Int, y: Int): String
   hidden(x: Int): Boolean
-  validity(y: Int): String
+  validity: String
+}
+
+type university_calc_Calculator__addShortWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Int!, y: Int): Int
+  params: university_calc_Calculator__addShortWrappers__gqlv_action_params
+  validate(x: Int, y: Int): String
+}
+
+type university_calc_Calculator__addShortWrappers__gqlv_action_params {
+  x: university_calc_Calculator__addShortWrappers__x__gqlv_action_parameter
+  y: university_calc_Calculator__addShortWrappers__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addShortWrappers__x__gqlv_action_parameter {
+  disabled(x: Int): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addShortWrappers__y__gqlv_action_parameter {
+  disabled(x: Int, y: Int): String
+  hidden(x: Int): Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addShorts__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Int!, y: Int!): Int
+  params: university_calc_Calculator__addShorts__gqlv_action_params
+  validate(x: Int, y: Int): String
+}
+
+type university_calc_Calculator__addShorts__gqlv_action_params {
+  x: university_calc_Calculator__addShorts__x__gqlv_action_parameter
+  y: university_calc_Calculator__addShorts__y__gqlv_action_parameter
+}
+
+type university_calc_Calculator__addShorts__x__gqlv_action_parameter {
+  disabled(x: Int): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__addShorts__y__gqlv_action_parameter {
+  disabled(x: Int, y: Int): String
+  hidden(x: Int): Boolean
+  validity: String
 }
 
 type university_calc_Calculator__and__gqlv_action {
@@ -2379,13 +2564,57 @@ type 
university_calc_Calculator__and__gqlv_action_params {
 type university_calc_Calculator__and__x__gqlv_action_parameter {
   disabled(x: Boolean): String
   hidden: Boolean
-  validity(x: Boolean): String
+  validity: String
 }
 
 type university_calc_Calculator__and__y__gqlv_action_parameter {
   disabled(x: Boolean, y: Boolean): String
   hidden(x: Boolean): Boolean
-  validity(y: Boolean): String
+  validity: String
+}
+
+type university_calc_Calculator__concat__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(prefix: String!, suffix: String): String
+  params: university_calc_Calculator__concat__gqlv_action_params
+  validate(prefix: String, suffix: String): String
+}
+
+type university_calc_Calculator__concat__gqlv_action_params {
+  prefix: university_calc_Calculator__concat__prefix__gqlv_action_parameter
+  suffix: university_calc_Calculator__concat__suffix__gqlv_action_parameter
+}
+
+type university_calc_Calculator__concat__prefix__gqlv_action_parameter {
+  disabled(prefix: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__concat__suffix__gqlv_action_parameter {
+  disabled(prefix: String, suffix: String): String
+  hidden(prefix: String): Boolean
+  validity: String
+}
+
+type university_calc_Calculator__nextMonth__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(month: String!): String
+  params: university_calc_Calculator__nextMonth__gqlv_action_params
+  validate(month: String): String
+}
+
+type university_calc_Calculator__nextMonth__gqlv_action_params {
+  month: university_calc_Calculator__nextMonth__month__gqlv_action_parameter
+}
+
+type university_calc_Calculator__nextMonth__month__gqlv_action_parameter {
+  choices: [String]
+  disabled(month: String): String
+  hidden: Boolean
+  validity: String
 }
 
 type university_calc_Calculator__not__gqlv_action {
@@ -2403,7 +2632,7 @@ type university_calc_Calculator__not__gqlv_action_params {
 type university_calc_Calculator__not__x__gqlv_action_parameter {
   disabled(x: Boolean): String
   hidden: Boolean
-  validity(x: Boolean): String
+  validity: String
 }
 
 type university_calc_Calculator__or__gqlv_action {
@@ -2422,19 +2651,19 @@ type university_calc_Calculator__or__gqlv_action_params 
{
 type university_calc_Calculator__or__x__gqlv_action_parameter {
   disabled(x: Boolean): String
   hidden: Boolean
-  validity(x: Boolean): String
+  validity: String
 }
 
 type university_calc_Calculator__or__y__gqlv_action_parameter {
   disabled(x: Boolean, y: Boolean): String
   hidden(x: Boolean): Boolean
-  validity(y: Boolean): String
+  validity: String
 }
 
 type university_calc_Calculator__plusDays__date__gqlv_action_parameter {
   disabled(date: String): String
   hidden: Boolean
-  validity(date: String): String
+  validity: String
 }
 
 type university_calc_Calculator__plusDays__gqlv_action {
@@ -2453,7 +2682,32 @@ type 
university_calc_Calculator__plusDays__gqlv_action_params {
 type university_calc_Calculator__plusDays__numDays__gqlv_action_parameter {
   disabled(date: String, numDays: Int): String
   hidden(date: String): Boolean
-  validity(numDays: Int): String
+  validity: String
+}
+
+type university_calc_Calculator__plusJodaDays__date__gqlv_action_parameter {
+  disabled(date: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type university_calc_Calculator__plusJodaDays__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(date: String!, numDays: Int!): String
+  params: university_calc_Calculator__plusJodaDays__gqlv_action_params
+  validate(date: String, numDays: Int): String
+}
+
+type university_calc_Calculator__plusJodaDays__gqlv_action_params {
+  date: university_calc_Calculator__plusJodaDays__date__gqlv_action_parameter
+  numDays: 
university_calc_Calculator__plusJodaDays__numDays__gqlv_action_parameter
+}
+
+type university_calc_Calculator__plusJodaDays__numDays__gqlv_action_parameter {
+  disabled(date: String, numDays: Int): String
+  hidden(date: String): Boolean
+  validity: String
 }
 
 type university_dept_Department {
@@ -2484,7 +2738,7 @@ type 
university_dept_Department__addStaffMember__staffMember__gqlv_action_parame
   autoComplete(search: String!): [university_dept_StaffMember]
   disabled(staffMember: university_dept_StaffMember__gqlv_input): String
   hidden: Boolean
-  validity(staffMember: university_dept_StaffMember__gqlv_input): String
+  validity: String
 }
 
 type university_dept_Department__addStaffMembers__gqlv_action {
@@ -2503,7 +2757,7 @@ type 
university_dept_Department__addStaffMembers__staffMembers__gqlv_action_para
   choices: [university_dept_StaffMember]
   disabled(staffMembers: [university_dept_StaffMember__gqlv_input]): String
   hidden: Boolean
-  validity(staffMembers: [university_dept_StaffMember__gqlv_input]): String
+  validity: String
 }
 
 type university_dept_Department__changeDeptHead__gqlv_action {
@@ -2523,7 +2777,7 @@ type 
university_dept_Department__changeDeptHead__newDeptHead__gqlv_action_parame
   default: university_dept_DeptHead
   disabled(newDeptHead: university_dept_DeptHead__gqlv_input): String
   hidden: Boolean
-  validity(newDeptHead: university_dept_DeptHead__gqlv_input): String
+  validity: String
 }
 
 type university_dept_Department__changeName__gqlv_action {
@@ -2542,7 +2796,7 @@ type 
university_dept_Department__changeName__newName__gqlv_action_parameter {
   default: String
   disabled(newName: String): String
   hidden: Boolean
-  validity(newName: String): String
+  validity: String
 }
 
 type university_dept_Department__deptHead__gqlv_property {
@@ -2584,7 +2838,7 @@ type 
university_dept_Department__removeStaffMember__staffMember__gqlv_action_par
   choices: [university_dept_StaffMember]
   disabled(staffMember: university_dept_StaffMember__gqlv_input): String
   hidden: Boolean
-  validity(staffMember: university_dept_StaffMember__gqlv_input): String
+  validity: String
 }
 
 type university_dept_Department__staffMembers__gqlv_collection {
@@ -2603,7 +2857,7 @@ type 
university_dept_Departments__createDepartment__deptHead__gqlv_action_parame
   autoComplete(name: String, search: String!): [university_dept_DeptHead]
   disabled(deptHead: university_dept_DeptHead__gqlv_input, name: String): 
String
   hidden(name: String): Boolean
-  validity(deptHead: university_dept_DeptHead__gqlv_input): String
+  validity: String
 }
 
 type university_dept_Departments__createDepartment__gqlv_action {
@@ -2622,7 +2876,7 @@ type 
university_dept_Departments__createDepartment__gqlv_action_params {
 type 
university_dept_Departments__createDepartment__name__gqlv_action_parameter {
   disabled(name: String): String
   hidden: Boolean
-  validity(name: String): String
+  validity: String
 }
 
 type university_dept_Departments__findAllDepartments__gqlv_action {
@@ -2647,7 +2901,7 @@ type 
university_dept_Departments__findByName__gqlv_action_params {
 type university_dept_Departments__findByName__name__gqlv_action_parameter {
   disabled(name: String): String
   hidden: Boolean
-  validity(name: String): String
+  validity: String
 }
 
 type university_dept_DeptHead {
@@ -2662,7 +2916,7 @@ type 
university_dept_DeptHead__changeDepartment__department__gqlv_action_paramet
   choices: [university_dept_Department]
   disabled(department: university_dept_Department__gqlv_input): String
   hidden: Boolean
-  validity(department: university_dept_Department__gqlv_input): String
+  validity: String
 }
 
 type university_dept_DeptHead__changeDepartment__gqlv_action {
@@ -2693,7 +2947,7 @@ type 
university_dept_DeptHead__changeName__newName__gqlv_action_parameter {
   default: String
   disabled(newName: String): String
   hidden: Boolean
-  validity(newName: String): String
+  validity: String
 }
 
 type university_dept_DeptHead__department__gqlv_property {
@@ -2746,7 +3000,7 @@ type 
university_dept_DeptHeads__findHeadByName__gqlv_action_params {
 type university_dept_DeptHeads__findHeadByName__name__gqlv_action_parameter {
   disabled(name: String): String
   hidden: Boolean
-  validity(name: String): String
+  validity: String
 }
 
 type university_dept_Staff {
@@ -2798,7 +3052,7 @@ type 
university_dept_Staff__createStaffMember__department__gqlv_action_parameter
   choices(name: String): [university_dept_Department]
   disabled(department: university_dept_Department__gqlv_input, name: String): 
String
   hidden(name: String): Boolean
-  validity(department: university_dept_Department__gqlv_input): String
+  validity: String
 }
 
 type university_dept_Staff__createStaffMember__gqlv_action {
@@ -2817,7 +3071,7 @@ type 
university_dept_Staff__createStaffMember__gqlv_action_params {
 type university_dept_Staff__createStaffMember__name__gqlv_action_parameter {
   disabled(name: String): String
   hidden: Boolean
-  validity(name: String): String
+  validity: String
 }
 
 type university_dept_Staff__findAllStaffMembers__gqlv_action {
@@ -2842,7 +3096,7 @@ type 
university_dept_Staff__findByName__gqlv_action_params {
 type university_dept_Staff__findByName__name__gqlv_action_parameter {
   disabled(name: String): String
   hidden: Boolean
-  validity(name: String): String
+  validity: String
 }
 
 input causeway_applib_DomainObjectList__gqlv_input {
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
index f1596fd919..5252488929 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
@@ -38,6 +38,7 @@ import 
org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainObject;
 import org.apache.causeway.viewer.graphql.model.domain.GqlvDomainService;
+import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 import org.apache.causeway.viewer.graphql.viewer.toplevel.GqlvTopLevelQuery;
 import org.apache.causeway.viewer.graphql.model.registry.GraphQLTypeRegistry;
 
@@ -73,6 +74,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
     private final ObjectManager objectManager;
     private final BookmarkService bookmarkService;
     private final GraphQLTypeRegistry graphQLTypeRegistry;
+    private final TypeMapper typeMapper;
     private final AsyncExecutionStrategyResolvingWithinInteraction 
executionStrategy;
 
     @PostConstruct
@@ -146,7 +148,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             final GqlvTopLevelQuery gqlvTopLevelQuery,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        Context context = new Context(codeRegistryBuilder, bookmarkService, 
specificationLoader);
+        Context context = new Context(codeRegistryBuilder, bookmarkService, 
specificationLoader, typeMapper);
 
         switch (objectSpec.getBeanSort()) {
 

Reply via email to