You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/11/14 18:08:57 UTC

[isis] branch 2177-object-manager created (now 162066f)

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

ahuber pushed a change to branch 2177-object-manager
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 162066f  ISIS-2177: reworks the ObjectLoader to use new ChainOfResponibility API

This branch includes the following new commits:

     new 162066f  ISIS-2177: reworks the ObjectLoader to use new ChainOfResponibility API

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[isis] 01/01: ISIS-2177: reworks the ObjectLoader to use new ChainOfResponibility API

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2177-object-manager
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 162066f17351b4db79e53986bbf6807ad84217d4
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 14 19:08:26 2019 +0100

    ISIS-2177: reworks the ObjectLoader to use new ChainOfResponibility API
    
    also adds initial ObjectCreator (as object creation is a new
    responsibility for ObjectManager)
---
 .../metamodel/adapter/ObjectAdapterProvider.java   |  25 +-
 .../metamodel/objectmanager/ObjectCreator.java     |  82 +++++
 .../ObjectCreator_builtinHandlers.java             | 380 +++++++++++++++++++++
 .../isis/metamodel/objectmanager/ObjectLoader.java |  59 ++--
 .../objectmanager/ObjectLoader_builder.java        |  64 ----
 .../ObjectLoader_builtinHandlers.java              |  39 ++-
 .../metamodel/objectmanager/ObjectManager.java     |  13 +-
 .../objectmanager/ObjectManager_default.java       |   1 +
 .../PersistenceSessionServiceInternal.java         |  15 +-
 .../apache/isis/metamodel/spec/ManagedObject.java  |  25 +-
 .../jdo/objectadapter/ObjectAdapterContext.java    |   2 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |   8 -
 .../ObjectAdapterContext_ObjectCreation.java       |  10 +-
 ...rnalDefault.java => FactoryServiceDefault.java} |  29 +-
 .../system/context/session/RuntimeContext.java     |  17 -
 .../system/context/session/RuntimeContextBase.java |  59 +---
 .../PersistenceSessionServiceInternalDefault.java  |   5 -
 .../resources/DomainObjectResourceServerside.java  |   2 +-
 18 files changed, 564 insertions(+), 271 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapterProvider.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapterProvider.java
index fc38f96..7616d49 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapterProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapterProvider.java
@@ -20,8 +20,6 @@ package org.apache.isis.metamodel.adapter;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-
 /**
  * 
  * @since 2.0
@@ -37,25 +35,9 @@ public interface ObjectAdapterProvider {
     @Nullable ObjectAdapter adapterFor(@Nullable Object pojo);
 
 
-    // -- DOMAIN OBJECT CREATION SUPPORT
-
-    /**
-     * <p>
-     * Creates a new instance of the specified type and returns it.
-     *
-     * <p>
-     * The returned object will be initialized (had the relevant callback
-     * lifecycle methods invoked).
-     *
-     * <p>
-     * While creating the object it will be initialized with default values and
-     * its created lifecycle method (its logical constructor) will be invoked.
-     *
-     */
-    ObjectAdapter newTransientInstance(ObjectSpecification objectSpec);
-
     // -- FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
 
+    @Deprecated
     public static interface Delegating extends ObjectAdapterProvider {
 
         ObjectAdapterProvider getObjectAdapterProvider();
@@ -65,11 +47,6 @@ public interface ObjectAdapterProvider {
             return getObjectAdapterProvider().adapterFor(domainObject);
         }
 
-        @Override
-        default ObjectAdapter newTransientInstance(ObjectSpecification objectSpec) {
-            return getObjectAdapterProvider().newTransientInstance(objectSpec);
-        }
-
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectCreator.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectCreator.java
new file mode 100644
index 0000000..f094c2c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectCreator.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.metamodel.objectmanager;
+
+import org.apache.isis.commons.handler.ChainOfResponsibility;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
+import org.apache.isis.metamodel.spec.ManagedObject;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
+
+import lombok.Value;
+import lombok.val;
+
+/**
+ * @since 2.0
+ */
+public interface ObjectCreator {
+
+    ManagedObject createObject(Request objectLoadRequest);
+    
+    // -- REQUEST (VALUE) TYPE
+    
+    @Value(staticConstructor = "of")
+    public static class Request {
+        ObjectSpecification objectSpecification;
+    }
+    
+    // -- HANDLER
+    
+    static interface Handler 
+    extends 
+        MetaModelContextAware, 
+        ChainOfResponsibility.Handler<ObjectCreator.Request, ManagedObject> {
+        
+    }
+
+    // -- FACTORY
+    
+    public static ObjectCreator createDefault(MetaModelContext metaModelContext) {
+        
+        val chainOfHandlers = _Lists.of(
+                new ObjectCreator_builtinHandlers.LegacyCreationHandler()
+                
+//                new ObjectCreator_builtinHandlers.GuardAgainstNull(),
+//                new ObjectCreator_builtinHandlers.LoadService(),
+//                new ObjectCreator_builtinHandlers.CreateValueDefault(),
+//                new ObjectCreator_builtinHandlers.CreateViewModel(),
+//                new ObjectCreator_builtinHandlers.CreateEntity(),
+//                new ObjectCreator_builtinHandlers.CreateOther()
+                );
+        
+        chainOfHandlers.forEach(h->h.setMetaModelContext(metaModelContext));
+        
+        val chainOfRespo = ChainOfResponsibility.of(chainOfHandlers);
+        
+        return request -> chainOfRespo
+                .handle(request)
+                .orElseThrow(()->_Exceptions.unrecoverableFormatted(
+                        "ObjectLoader failed to hanlde request %s", request));
+        
+    }
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectCreator_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectCreator_builtinHandlers.java
new file mode 100644
index 0000000..f1ba73f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectCreator_builtinHandlers.java
@@ -0,0 +1,380 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.metamodel.objectmanager;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Modifier;
+
+import org.apache.isis.applib.events.lifecycle.AbstractLifecycleEvent;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.commons.exceptions.IsisException;
+import org.apache.isis.commons.internal.factory.InstanceUtil;
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.facets.object.callbacks.CallbackFacet;
+import org.apache.isis.metamodel.facets.object.callbacks.CreatedCallbackFacet;
+import org.apache.isis.metamodel.facets.object.callbacks.CreatedLifecycleEventFacet;
+import org.apache.isis.metamodel.facets.object.callbacks.LifecycleEventFacet;
+import org.apache.isis.metamodel.spec.ManagedObject;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.spec.feature.Contributed;
+
+import lombok.Data;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+final class ObjectCreator_builtinHandlers {
+    
+    @Data @Log4j2
+    public static class LegacyCreationHandler implements ObjectCreator.Handler {
+        
+        private MetaModelContext metaModelContext;
+        
+        @Override
+        public boolean isHandling(ObjectCreator.Request objectCreateRequest) {
+            return true;
+        }
+
+        @Override
+        public ManagedObject handle(ObjectCreator.Request objectCreateRequest) {
+            
+            //XXX legacy of objectAdapterContext.objectCreationMixin.newInstance(objectSpec);
+            
+            val spec = objectCreateRequest.getObjectSpecification();
+            
+            if (log.isDebugEnabled()) {
+                log.debug("creating instance of {}", spec);
+            }
+            
+            val pojo = instantiateAndInjectServices(spec);
+
+            val adapter = ManagedObject.of(spec, pojo);
+            return initializePropertiesAndDoCallback(adapter);
+        }
+        
+        //  -- HELPER
+        
+        private ManagedObject initializePropertiesAndDoCallback(final ManagedObject adapter) {
+
+            // initialize new object
+            adapter.getSpecification().streamAssociations(Contributed.EXCLUDED)
+            .forEach(field->field.toDefault(adapter));
+
+            val pojo = adapter.getPojo();
+            metaModelContext.getServiceInjector().injectServicesInto(pojo);
+
+            CallbackFacet.Util.callCallback(adapter, CreatedCallbackFacet.class);
+
+            if (Command.class.isAssignableFrom(pojo.getClass())) {
+
+                // special case... the command object is created while the transaction is being started and before
+                // the event bus service is initialized (nb: we initialize services *within* a transaction).  To resolve
+                // this catch-22 situation, we simply suppress the posting of this event for this domain class.
+
+                // this seems the least unpleasant of the various options available:
+                // * we could have put a check in the EventBusService to ignore the post if not yet initialized;
+                //   however this might hide other genuine errors
+                // * we could have used the thread-local in JdoStateManagerForIsis and the "skip(...)" hook in EventBusServiceJdo
+                //   to have this event be skipped; but that seems like co-opting some other design
+                // * we could have the transaction initialize the EventBusService as a "special case" before creating the Command;
+                //   but then do we worry about it being re-init'd later by the ServicesInitializer?
+
+                // so, doing it this way is this simplest, least obscure.
+
+                if(log.isDebugEnabled()) {
+                    log.debug("Skipping postEvent for creation of Command pojo");
+                }
+
+            } else {
+                postLifecycleEventIfRequired(adapter, CreatedLifecycleEventFacet.class);
+            }
+
+            return adapter;
+        }
+        
+        private Object instantiateAndInjectServices(final ObjectSpecification objectSpec) {
+
+            final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
+            if (correspondingClass.isArray()) {
+                return Array.newInstance(correspondingClass.getComponentType(), 0);
+            }
+
+            final Class<?> cls = correspondingClass;
+            if (Modifier.isAbstract(cls.getModifiers())) {
+                throw new IsisException("Cannot create an instance of an abstract class: " + cls);
+            }
+
+            final Object newInstance;
+            try {
+                newInstance = cls.newInstance();
+            } catch (final IllegalAccessException | InstantiationException e) {
+                throw new IsisException("Failed to create instance of type " + objectSpec.getFullIdentifier(), e);
+            }
+
+            metaModelContext.getServiceInjector().injectServicesInto(newInstance);
+            return newInstance;
+
+        }
+        
+        @SuppressWarnings({ "unchecked", "rawtypes" })
+        private void postLifecycleEventIfRequired(
+                ManagedObject adapter,
+                Class<? extends LifecycleEventFacet> lifecycleEventFacetClass) {
+            
+            val lifecycleEventFacet = adapter.getSpecification().getFacet(lifecycleEventFacetClass);
+            if(lifecycleEventFacet != null) {
+                final Class<? extends AbstractLifecycleEvent<?>> eventType = lifecycleEventFacet.getEventType();
+                val instance = (AbstractLifecycleEvent) InstanceUtil.createInstance(eventType);
+                val pojo = adapter.getPojo();
+                postEvent(instance, pojo);
+            }
+        }
+
+        private void postEvent(final AbstractLifecycleEvent<Object> event, final Object pojo) {
+            val eventBusService = metaModelContext.getServiceRegistry()
+                    .lookupServiceElseFail(EventBusService.class);
+            if(eventBusService!=null) {
+                event.initSource(pojo);
+                eventBusService.post(event);
+            }
+        }
+        
+
+    }
+    
+
+    // -- NULL GUARD
+    
+//    @Data
+//    public static class GuardAgainstNull implements ObjectCreator.Handler {
+//        
+//        private MetaModelContext metaModelContext;
+//        
+//        @Override
+//        public boolean isHandling(Request objectLoadRequest) {
+//            
+//            if(objectLoadRequest==null) {
+//                return true;
+//            }
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            if(spec == null) {
+//                // eg "NONEXISTENT:123"
+//                return true;
+//            }
+//
+//            return false;
+//        }
+//
+//        @Override
+//        public ManagedObject handle(Request objectLoadRequest) {
+//            return null; // yes null
+//        }
+//
+//    }
+    
+    // -- MANAGED BEANS
+
+//    @Data
+//    public static class LoadService implements ObjectCreator.Handler {
+//        
+//        private MetaModelContext metaModelContext;
+//
+//        @Override
+//        public boolean isHandling(Request objectLoadRequest) {
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            return spec.isManagedBean();
+//        }
+//
+//        @Override
+//        public ManagedObject handle(Request objectLoadRequest) {
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            val beanName = spec.getSpecId().asString();
+//            
+//            val servicePojo = metaModelContext.getServiceRegistry()
+//                .lookupRegisteredBeanById(beanName)
+//                .map(ManagedBeanAdapter::getInstance)
+//                .flatMap(Can::getFirst)
+//                .orElseThrow(()->_Exceptions.noSuchElement(
+//                        "loader: %s loading beanName %s", 
+//                        this.getClass().getName(), beanName));
+//            
+//            return ManagedObject.of(spec, servicePojo);
+//        }
+//
+//    }
+    
+    // -- VALUES
+    
+//    @Data
+//    public static class CreateValueDefault implements ObjectCreator.Handler {
+//
+//        private MetaModelContext metaModelContext;
+//        
+//        @Override
+//        public boolean isHandling(Request objectLoadRequest) {
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            return spec.isValue();
+//        }
+//
+//        @Override
+//        public ManagedObject handle(Request objectLoadRequest) {
+//            
+//            // cannot load a value
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            throw _Exceptions.illegalArgument(
+//                    "cannot load a value, loader: %s loading ObjectSpecification %s", 
+//                        this.getClass().getName(), spec);
+//        }
+//
+//    }
+//
+//    // -- VIEW MODELS
+//    
+//    @Data
+//    public static class CreateViewModel implements ObjectCreator.Handler {
+//        
+//        private MetaModelContext metaModelContext;
+//
+//        @Override
+//        public boolean isHandling(Request objectLoadRequest) {
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            return spec.isViewModel();
+//        }
+//
+//        @Override
+//        public ManagedObject handle(Request objectLoadRequest) {
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            val viewModelFacet = spec.getFacet(ViewModelFacet.class);
+//            if(viewModelFacet == null) {
+//                throw _Exceptions.illegalArgument(
+//                        "ObjectSpecification is missing a ViewModelFacet: %s", spec);
+//            }
+//            
+//            val memento = objectLoadRequest.getObjectIdentifier();
+//            final Object viewModelPojo;
+//            if(viewModelFacet.getRecreationMechanism().isInitializes()) {
+//                viewModelPojo = this.instantiateAndInjectServices(spec);
+//                viewModelFacet.initialize(viewModelPojo, memento);
+//            } else {
+//                viewModelPojo = viewModelFacet.instantiate(spec.getCorrespondingClass(), memento);
+//            }
+//            
+//            return ManagedObject.of(spec, viewModelPojo);
+//        }
+//        
+//        private Object instantiateAndInjectServices(ObjectSpecification spec) {
+//
+//            val type = spec.getCorrespondingClass();
+//            if (type.isArray()) {
+//                return Array.newInstance(type.getComponentType(), 0);
+//            }
+//
+//            if (Modifier.isAbstract(type.getModifiers())) {
+//                throw _Exceptions.illegalArgument("Cannot create an instance of an abstract class '%s', "
+//                        + "creator: %s creating ObjectSpecification %s", 
+//                        type, this.getClass().getName(), spec);
+//            }
+//
+//            final Object newInstance;
+//            try {
+//                newInstance = type.newInstance();
+//            } catch (final IllegalAccessException | InstantiationException e) {
+//                throw _Exceptions.illegalArgument("Failed to create instance of type '%s', "
+//                        + "creator: %s creating ObjectSpecification %s", 
+//                        type, this.getClass().getName(), spec);
+//            }
+//
+//            metaModelContext.getServiceInjector().injectServicesInto(newInstance);
+//            return newInstance;
+//        }
+//
+//    }
+//
+//    // -- ENTITIES
+//    
+//    @Data
+//    public static class CreateEntity implements ObjectCreator.Handler {
+//        
+//        private MetaModelContext metaModelContext;
+//
+//        @Override
+//        public boolean isHandling(Request objectLoadRequest) {
+//            
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            return spec.isEntity();
+//        }
+//
+//        @Override
+//        public ManagedObject handle(Request objectLoadRequest) {
+//
+//            val spec = objectLoadRequest.getObjectSpecification();
+//            val entityFacet = spec.getFacet(EntityFacet.class);
+//            if(entityFacet==null) {
+//                throw _Exceptions.illegalArgument(
+//                        "ObjectSpecification is missing an EntityFacet: %s", spec);
+//            }
+//            
+//            val identifier = objectLoadRequest.getObjectIdentifier();
+//            val entityPojo = entityFacet.fetchByIdentifier(spec, identifier);
+//            
+//            metaModelContext.getServiceInjector().injectServicesInto(entityPojo);
+//            
+//            return ManagedObject.of(spec, entityPojo);
+//        }
+//
+//    }
+//    
+//    // -- UNKNOWN LOAD REQUEST
+//    
+//    @Data
+//    public static class CreateOther implements ObjectCreator.Handler {
+//        
+//        private MetaModelContext metaModelContext;
+//
+//        @Override
+//        public boolean isHandling(Request objectLoadRequest) {
+//            return true; // the last handler in the chain
+//        }
+//
+//        @Override
+//        public ManagedObject handle(Request objectLoadRequest) {
+//
+//            // unknown object load request
+//            
+//            throw _Exceptions.illegalArgument(
+//                    "unknown object create request, creator: %s creating from ObjectSpecification %s", 
+//                        this.getClass().getName(), objectLoadRequest.getObjectSpecification());
+//
+//        }
+//
+//    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader.java
index d582e1c..d6a711b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.metamodel.objectmanager;
 
+import org.apache.isis.commons.handler.ChainOfResponsibility;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -32,44 +35,46 @@ import lombok.val;
  */
 public interface ObjectLoader {
 
-    ManagedObject loadObject(ObjectLoadRequest objectLoadRequest);
-
-    // -- REQUEST
+    ManagedObject loadObject(Request objectLoadRequest);
+    
+    // -- REQUEST (VALUE) TYPE
     
     @Value(staticConstructor = "of")
-    public static class ObjectLoadRequest {
+    public static class Request {
         ObjectSpecification objectSpecification;
         String objectIdentifier;
     }
     
     // -- HANDLER
     
-    public interface Handler extends MetaModelContextAware {
-        boolean isHandling(ObjectLoadRequest objectLoadRequest);
-        ManagedObject loadObject(ObjectLoadRequest objectLoadRequest);
+    static interface Handler 
+    extends 
+        MetaModelContextAware, 
+        ChainOfResponsibility.Handler<ObjectLoader.Request, ManagedObject> {
+        
     }
 
-    // -- BUILDER
+    // -- FACTORY
     
-    public interface ObjectLoaderBuilder {
-        ObjectLoaderBuilder add(Handler handler);
-        ObjectLoader build();
-    }
-
-    public static ObjectLoaderBuilder builder(MetaModelContext metaModelContext) {
-        return new ObjectLoader_builder(metaModelContext);
-    }
-
-    public static ObjectLoader buildDefault(MetaModelContext metaModelContext) {
-        val objectLoader = ObjectLoader.builder(metaModelContext)
-                .add(new ObjectLoader_builtinHandlers.GuardAgainstNull())
-                .add(new ObjectLoader_builtinHandlers.LoadService())
-                .add(new ObjectLoader_builtinHandlers.LoadValue())
-                .add(new ObjectLoader_builtinHandlers.LoadViewModel())
-                .add(new ObjectLoader_builtinHandlers.LoadEntity())
-                .add(new ObjectLoader_builtinHandlers.LoadOther())
-                .build();
-        return objectLoader;
+    public static ObjectLoader createDefault(MetaModelContext metaModelContext) {
+        
+        val chainOfHandlers = _Lists.of(
+                new ObjectLoader_builtinHandlers.GuardAgainstNull(),
+                new ObjectLoader_builtinHandlers.LoadService(),
+                new ObjectLoader_builtinHandlers.LoadValue(),
+                new ObjectLoader_builtinHandlers.LoadViewModel(),
+                new ObjectLoader_builtinHandlers.LoadEntity(),
+                new ObjectLoader_builtinHandlers.LoadOther());
+        
+        chainOfHandlers.forEach(h->h.setMetaModelContext(metaModelContext));
+        
+        val chainOfRespo = ChainOfResponsibility.of(chainOfHandlers);
+        
+        return request -> chainOfRespo
+                .handle(request)
+                .orElseThrow(()->_Exceptions.unrecoverableFormatted(
+                        "ObjectLoader failed to hanlde request %s", request));
+        
     }
     
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builder.java
deleted file mode 100644
index 44a6cda..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builder.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.objectmanager;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-import org.apache.isis.metamodel.MetaModelContext;
-import org.apache.isis.metamodel.objectmanager.ObjectLoader.ObjectLoaderBuilder;
-
-import lombok.RequiredArgsConstructor;
-import lombok.val;
-
-@RequiredArgsConstructor
-class ObjectLoader_builder implements ObjectLoaderBuilder {
-    
-    private final MetaModelContext metaModelContext;
-
-    private final List<ObjectLoader.Handler> handlers = new ArrayList<>();
-
-    @Override
-    public ObjectLoader_builder add(ObjectLoader.Handler handler) {
-        handler.setMetaModelContext(metaModelContext);
-        handlers.add(handler);
-        return this;
-    }
-
-    @Override
-    public ObjectLoader build() {
-        return oid -> {
-
-            val managedObject = handlers.stream()
-                    .filter(h->h.isHandling(oid))
-                    .findFirst()
-                    .map(h->h.loadObject(oid))
-                    .orElse(null);
-
-            Objects.requireNonNull(managedObject, 
-                    () -> "Could not create a ManagedObject for Oid: " + oid);
-
-            return managedObject;
-        };
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builtinHandlers.java
index c581165..befc899 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectLoader_builtinHandlers.java
@@ -27,8 +27,7 @@ import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.metamodel.objectmanager.ObjectLoader.Handler;
-import org.apache.isis.metamodel.objectmanager.ObjectLoader.ObjectLoadRequest;
+import org.apache.isis.metamodel.objectmanager.ObjectLoader.Request;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
@@ -45,12 +44,12 @@ final class ObjectLoader_builtinHandlers {
     // -- NULL GUARD
     
     @Data
-    public static class GuardAgainstNull implements Handler {
+    public static class GuardAgainstNull implements ObjectLoader.Handler {
         
         private MetaModelContext metaModelContext;
         
         @Override
-        public boolean isHandling(ObjectLoadRequest objectLoadRequest) {
+        public boolean isHandling(Request objectLoadRequest) {
             
             if(objectLoadRequest==null) {
                 return true;
@@ -68,7 +67,7 @@ final class ObjectLoader_builtinHandlers {
         }
 
         @Override
-        public ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+        public ManagedObject handle(Request objectLoadRequest) {
             return null; // yes null
         }
 
@@ -77,19 +76,19 @@ final class ObjectLoader_builtinHandlers {
     // -- MANAGED BEANS
 
     @Data
-    public static class LoadService implements Handler {
+    public static class LoadService implements ObjectLoader.Handler {
         
         private MetaModelContext metaModelContext;
 
         @Override
-        public boolean isHandling(ObjectLoadRequest objectLoadRequest) {
+        public boolean isHandling(Request objectLoadRequest) {
             
             val spec = objectLoadRequest.getObjectSpecification();
             return spec.isManagedBean();
         }
 
         @Override
-        public ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+        public ManagedObject handle(Request objectLoadRequest) {
             
             val spec = objectLoadRequest.getObjectSpecification();
             val beanName = spec.getSpecId().asString();
@@ -110,19 +109,19 @@ final class ObjectLoader_builtinHandlers {
     // -- VALUES
     
     @Data
-    public static class LoadValue implements Handler {
+    public static class LoadValue implements ObjectLoader.Handler {
 
         private MetaModelContext metaModelContext;
         
         @Override
-        public boolean isHandling(ObjectLoadRequest objectLoadRequest) {
+        public boolean isHandling(Request objectLoadRequest) {
             
             val spec = objectLoadRequest.getObjectSpecification();
             return spec.isValue();
         }
 
         @Override
-        public ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+        public ManagedObject handle(Request objectLoadRequest) {
             
             // cannot load a value
             
@@ -137,19 +136,19 @@ final class ObjectLoader_builtinHandlers {
     // -- VIEW MODELS
     
     @Data
-    public static class LoadViewModel implements Handler {
+    public static class LoadViewModel implements ObjectLoader.Handler {
         
         private MetaModelContext metaModelContext;
 
         @Override
-        public boolean isHandling(ObjectLoadRequest objectLoadRequest) {
+        public boolean isHandling(Request objectLoadRequest) {
             
             val spec = objectLoadRequest.getObjectSpecification();
             return spec.isViewModel();
         }
 
         @Override
-        public ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+        public ManagedObject handle(Request objectLoadRequest) {
             
             val spec = objectLoadRequest.getObjectSpecification();
             val viewModelFacet = spec.getFacet(ViewModelFacet.class);
@@ -201,19 +200,19 @@ final class ObjectLoader_builtinHandlers {
     // -- ENTITIES
     
     @Data
-    public static class LoadEntity implements Handler {
+    public static class LoadEntity implements ObjectLoader.Handler {
         
         private MetaModelContext metaModelContext;
 
         @Override
-        public boolean isHandling(ObjectLoadRequest objectLoadRequest) {
+        public boolean isHandling(Request objectLoadRequest) {
             
             val spec = objectLoadRequest.getObjectSpecification();
             return spec.isEntity();
         }
 
         @Override
-        public ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+        public ManagedObject handle(Request objectLoadRequest) {
 
             val spec = objectLoadRequest.getObjectSpecification();
             val entityFacet = spec.getFacet(EntityFacet.class);
@@ -235,17 +234,17 @@ final class ObjectLoader_builtinHandlers {
     // -- UNKNOWN LOAD REQUEST
     
     @Data
-    public static class LoadOther implements Handler {
+    public static class LoadOther implements ObjectLoader.Handler {
         
         private MetaModelContext metaModelContext;
 
         @Override
-        public boolean isHandling(ObjectLoadRequest objectLoadRequest) {
+        public boolean isHandling(Request objectLoadRequest) {
             return true; // the last handler in the chain
         }
 
         @Override
-        public ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+        public ManagedObject handle(Request objectLoadRequest) {
 
             // unknown object load request
             
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager.java
index c91c1d0..a01dc87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel.objectmanager;
 import javax.annotation.Nullable;
 
 import org.apache.isis.metamodel.MetaModelContext;
-import org.apache.isis.metamodel.objectmanager.ObjectLoader.ObjectLoadRequest;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
@@ -35,15 +34,21 @@ import lombok.val;
 public interface ObjectManager {
 
     MetaModelContext getMetaModelContext();
+    ObjectCreator getObjectCreator();
     ObjectLoader getObjectLoader();
 
     public static ObjectManager of(MetaModelContext metaModelContext) {
-        val objectLoader = ObjectLoader.buildDefault(metaModelContext);
-        val objectManager = new ObjectManager_default(metaModelContext, objectLoader);
+        val objectCreator = ObjectCreator.createDefault(metaModelContext);
+        val objectLoader = ObjectLoader.createDefault(metaModelContext);
+        val objectManager = new ObjectManager_default(metaModelContext, objectLoader, objectCreator);
         return objectManager;
     }
 
-    public default ManagedObject loadObject(ObjectLoadRequest objectLoadRequest) {
+    public default ManagedObject createObject(ObjectCreator.Request objectCreateRequest) {
+        return getObjectCreator().createObject(objectCreateRequest);
+    }
+    
+    public default ManagedObject loadObject(ObjectLoader.Request objectLoadRequest) {
         return getObjectLoader().loadObject(objectLoadRequest);
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager_default.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager_default.java
index 6c8b68f..e92a30e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager_default.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/objectmanager/ObjectManager_default.java
@@ -29,5 +29,6 @@ class ObjectManager_default implements ObjectManager {
 
     @Getter(onMethod = @__(@Override)) private final MetaModelContext metaModelContext;
     @Getter(onMethod = @__(@Override)) private final ObjectLoader objectLoader;
+    @Getter(onMethod = @__(@Override)) private final ObjectCreator objectCreator;
     
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/persistsession/PersistenceSessionServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
index b19b75b..3479078 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
@@ -25,19 +25,18 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
 
 public interface PersistenceSessionServiceInternal extends ObjectAdapterProvider.Delegating {
 
     // -- instantiate
 
-    /**
-     * Provided by the <tt>PersistenceSession</tt> when used by framework.
-     *
-     * <p>
-     * Called by <tt>DomainObjectContainerDefault</tt>.
-     */
-    ObjectAdapter createTransientInstance(ObjectSpecification spec);
+//    /**
+//     * Provided by the <tt>PersistenceSession</tt> when used by framework.
+//     *
+//     * <p>
+//     * Called by <tt>DomainObjectContainerDefault</tt>.
+//     */
+//    ObjectAdapter createTransientInstance(ObjectSpecification spec);
 
     //ObjectAdapter createViewModelInstance(ObjectSpecification spec, String memento);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index 8329d3d..6b66161 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -42,6 +42,7 @@ import org.apache.isis.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.metamodel.interactions.InteractionUtils;
 import org.apache.isis.metamodel.interactions.ObjectVisibilityContext;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
+import org.apache.isis.metamodel.objectmanager.ObjectCreator;
 import org.apache.isis.metamodel.objectmanager.ObjectLoader;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.metamodel.specloader.SpecificationLoaderDefault;
@@ -99,8 +100,6 @@ public interface ManagedObject {
 
     }
     
-    //Function<Class<?>, ObjectSpecification> specLoader
-    
     // -- TITLE
 
     public default String titleString() {
@@ -304,9 +303,8 @@ public interface ManagedObject {
     }
     
     // -- DEPRECATIONS (in an attempt to decouple the metamodel from ObjectAdapter)
-    
     @Deprecated
-    public static Optional<ObjectAdapter> promote(ManagedObject managedObject) {
+    static Optional<ObjectAdapter> promote(ManagedObject managedObject) {
         return Optional.ofNullable(managedObject)
         .filter(mo->mo instanceof ObjectAdapter) 
         .map(ObjectAdapter.class::cast);
@@ -460,12 +458,27 @@ public interface ManagedObject {
         val spec = specificationLoader.loadSpecification(rootOid.getObjectSpecId());
         val objectId = rootOid.getIdentifier();
         
-        val objectLoadRequest = ObjectLoader.ObjectLoadRequest.of(spec, objectId);
+        val objectLoadRequest = ObjectLoader.Request.of(spec, objectId);
         val managedObject = mmc.getObjectManager().loadObject(objectLoadRequest);
         
         return managedObject;
         
     }
+    
+    static ManagedObject _newTransientInstance(ObjectSpecification spec) {
+        
+        if(spec == null) {
+            return null;
+        }
+        
+        val mmc = spec.getMetaModelContext();
+        
+        val objectCreateRequest = ObjectCreator.Request.of(spec);
+        val managedObject = mmc.getObjectManager().createObject(objectCreateRequest);
+        
+        return managedObject;
+        
+    }
 
     @Deprecated
     static ManagedObject _adapterOfList(SpecificationLoader specificationLoader, DomainObjectList list) {
@@ -512,5 +525,7 @@ public interface ManagedObject {
 //                .map(ManagedObject.class::cast);
     }
 
+
+
     
  }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java
index e78f617..005c1cb 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java
@@ -88,7 +88,7 @@ final public class ObjectAdapterContext {
         this.newIdentifierMixin = new ObjectAdapterContext_NewIdentifier(persistenceSession, runtimeContext.getSpecificationLoader());
         this.objectAdapterByIdProviderMixin = new ObjectAdapterContext_ObjectAdapterByIdProvider(this, persistenceSession, runtimeContext);
         this.dependencyInjectionMixin = new ObjectAdapterContext_DependencyInjection(runtimeContext);
-        this.objectCreationMixin = new ObjectAdapterContext_ObjectCreation(this, persistenceSession, runtimeContext);
+        this.objectCreationMixin = new ObjectAdapterContext_ObjectCreation(this, runtimeContext);
         this.lifecycleEventMixin = new ObjectAdapterContext_LifecycleEventSupport(runtimeContext);
 
         this.persistenceSession = persistenceSession;
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectAdapterProvider.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectAdapterProvider.java
index 64f3f1c..a641a15 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -22,7 +22,6 @@ import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.adapter.oid.factory.OidFactory;
 import org.apache.isis.metamodel.spec.ManagedObject;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.context.session.RuntimeContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
@@ -64,12 +63,5 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
         return objectAdapterContext.injectServices(newAdapter);
     }
 
-    // -- DOMAIN OBJECT CREATION SUPPORT
-
-    @Override
-    public ObjectAdapter newTransientInstance(ObjectSpecification objectSpec) {
-        return objectAdapterContext.objectCreationMixin.newInstance(objectSpec);
-    }
-
 
 }
\ No newline at end of file
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectCreation.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectCreation.java
index 35f4eb2..103bcd5 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectCreation.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_ObjectCreation.java
@@ -32,9 +32,7 @@ import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.Contributed;
 import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.context.session.RuntimeContext;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 import lombok.extern.log4j.Log4j2;
 
@@ -49,21 +47,15 @@ import lombok.extern.log4j.Log4j2;
 class ObjectAdapterContext_ObjectCreation {
 
     private final ObjectAdapterContext objectAdapterContext;
-    @SuppressWarnings("unused")
-    private final PersistenceSession persistenceSession;
-    @SuppressWarnings("unused")
-    private final SpecificationLoader specificationLoader;
+    
     private ServiceInjector serviceInjector;
 
     ObjectAdapterContext_ObjectCreation(
             ObjectAdapterContext objectAdapterContext,
-            PersistenceSession persistenceSession,
             RuntimeContext runtimeContext) {
 
         this.objectAdapterContext = objectAdapterContext;
-        this.persistenceSession = persistenceSession;
         this.serviceInjector = runtimeContext.getServiceInjector();
-        this.specificationLoader = runtimeContext.getSpecificationLoader();
     }
 
     public ObjectAdapter newInstance(ObjectSpecification objectSpec) {
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
similarity index 83%
rename from core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java
rename to core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
index cb02a13..7b86a9e 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceInternalDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/factory/FactoryServiceDefault.java
@@ -30,12 +30,10 @@ import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.metamodel.services.persistsession.PersistenceSessionServiceInternal;
+import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
@@ -45,24 +43,19 @@ import static org.apache.isis.commons.internal.base._With.requires;
 import lombok.val;
 
 @Service 
-public class FactoryServiceInternalDefault implements FactoryService {
+public class FactoryServiceDefault implements FactoryService {
+    
+    @Inject IsisSessionFactory isisSessionFactory; // dependsOn
+    @Inject private SpecificationLoader specificationLoader;
+    @Inject private ServiceInjector serviceInjector;
 
     @Override
-    @SuppressWarnings("unchecked")
     public <T> T instantiate(final Class<T> domainClass) {
         final ObjectSpecification spec = specificationLoader.loadSpecification(domainClass);
-        final ObjectAdapter adapter = doCreateTransientInstance(spec);
-        return (T) adapter.getPojo();
-    }
-
-    /**
-     * Factored out as a potential hook method for subclasses.
-     */
-    protected ObjectAdapter doCreateTransientInstance(final ObjectSpecification spec) {
-        return persistenceSessionServiceInternal.createTransientInstance(spec);
+        final ManagedObject adapter = ManagedObject._newTransientInstance(spec); 
+        return _Casts.uncheckedCast(adapter.getPojo());
     }
 
-
     @Override
     public <T> T mixin(final Class<T> mixinClass, final Object mixedIn) {
         final ObjectSpecification objectSpec = specificationLoader.loadSpecification(mixinClass);
@@ -116,11 +109,7 @@ public class FactoryServiceInternalDefault implements FactoryService {
     }
 
 
-    @Inject IsisSessionFactory isisSessionFactory; // dependsOn
-    @Inject SpecificationLoader specificationLoader;
-    @Inject ServiceRegistry serviceRegistry;
-    @Inject ServiceInjector serviceInjector;
-    @Inject PersistenceSessionServiceInternal persistenceSessionServiceInternal;
+
 
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContext.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContext.java
index 5debb60..d20e0f3 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContext.java
@@ -22,15 +22,8 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.adapter.oid.Oid;
-import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.services.homepage.HomePageAction;
-import org.apache.isis.metamodel.spec.ManagedObjectState;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.memento.Data;
-import org.apache.isis.runtime.persistence.FixturesInstalledState;
 import org.apache.isis.security.authentication.AuthenticationSession;
 
 /**
@@ -50,16 +43,6 @@ public interface RuntimeContext {
     ServiceRegistry getServiceRegistry();
     HomePageAction getHomePageAction();
 
-    ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data);
-
-    ObjectAdapter newTransientInstance(ObjectSpecification domainTypeSpec);
-
-    void makePersistentInTransaction(ObjectAdapter objectAdapter);
-    Object fetchPersistentPojoInTransaction(RootOid rootOid);
-
-    ManagedObjectState stateOf(Object domainObject);
-    FixturesInstalledState getFixturesInstalledState();
-
     void logoutAuthenticationSession();
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContextBase.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContextBase.java
index 6038807..d83b664 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContextBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/session/RuntimeContextBase.java
@@ -23,21 +23,11 @@ import java.util.function.Supplier;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.adapter.oid.Oid;
-import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.metamodel.services.homepage.HomePageAction;
-import org.apache.isis.metamodel.spec.ManagedObjectState;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.memento.Data;
-import org.apache.isis.runtime.persistence.FixturesInstalledState;
-import org.apache.isis.runtime.system.context.IsisContext;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.security.authentication.manager.AuthenticationManager;
@@ -87,27 +77,13 @@ public abstract class RuntimeContextBase implements RuntimeContext {
         return homePageActionResolver.get();
     }
 
-    // -- OBJECT ADAPTER SUPPORT
-
-    @Override //FIXME [2033] decouple from JDO
-    public ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data) {
-        return ps().adapterOfMemento(spec, oid, data);
-    }
-
-    // -- FIXTURE SCRIPT STATE SUPPORT
-
-    @Override //FIXME [2033] decouple from JDO
-    public FixturesInstalledState getFixturesInstalledState() {
-        return ps().getFixturesInstalledState();
-    }
-
     // -- AUTH
 
     @Override
     public void logoutAuthenticationSession() {
         // we do the logout (removes this session from those valid)
         // similar code in wicket viewer (AuthenticatedWebSessionForIsis#onInvalidate())
-        final AuthenticationSession authenticationSession = getAuthenticationSession();
+        val authenticationSession = getAuthenticationSession();
         
         val authenticationManager = getServiceRegistry().lookupServiceElseFail(AuthenticationManager.class);
         authenticationManager.closeSession(authenticationSession);
@@ -116,38 +92,5 @@ public abstract class RuntimeContextBase implements RuntimeContext {
         isisSessionFactory.closeSession();	
     }
 
-    // -- ENTITY SUPPORT
-
-    @Override
-    public ObjectAdapter newTransientInstance(ObjectSpecification domainTypeSpec) {
-        return ps().newTransientInstance(domainTypeSpec);
-    }
-
-    @Override
-    public void makePersistentInTransaction(ObjectAdapter objectAdapter) {
-        ps().makePersistentInTransaction(objectAdapter);
-    }
-
-    @Override
-    public Object fetchPersistentPojoInTransaction(RootOid rootOid) {
-        return ps().fetchPersistentPojoInTransaction(rootOid);
-    }
-
-    @Override
-    public ManagedObjectState stateOf(Object domainObject) {
-        return ps().stateOf(domainObject);	
-    }
-
-    // -- PERSISTENCE SUPPORT FOR MANAGED OBJECTS
-
-    private final _Lazy<PersistenceSession> persistenceSession = 
-            _Lazy.of(IsisContext.getPersistenceSession()::get);
- 
-
-    private PersistenceSession ps() {
-        return persistenceSession.get();
-    }
-
-    // --
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java
index b50bbf2..5e74568 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/transaction/PersistenceSessionServiceInternalDefault.java
@@ -62,11 +62,6 @@ implements PersistenceSessionServiceInternal {
     }
 
     @Override
-    public ObjectAdapter createTransientInstance(final ObjectSpecification spec) {
-        return getPersistenceSession().newTransientInstance(spec);
-    }
-
-    @Override
     public Object lookup(
             final Bookmark bookmark,
             final BookmarkService.FieldResetPolicy fieldResetPolicy) {
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
index c2f2b48..be82e13 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
@@ -105,7 +105,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.BAD_REQUEST, "Could not determine type of domain object to persist (no class with domainType Id of '%s')", domainType);
         }
 
-        final ManagedObject adapter = getResourceContext().newTransientInstance(domainTypeSpec);
+        final ManagedObject adapter = ManagedObject._newTransientInstance(domainTypeSpec);
 
         final ObjectAdapterUpdateHelper updateHelper = new ObjectAdapterUpdateHelper(getResourceContext(), adapter);