You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/10/30 14:59:18 UTC

[2/8] git commit: ISIS-939: simplified ClassSubstitutor and ObjectFactory.

ISIS-939: simplified ClassSubstitutor and ObjectFactory.


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

Branch: refs/heads/master
Commit: a22b88f952082684b6632beecf548c8f5ea1e565
Parents: f4b9021
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Oct 28 17:06:14 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Oct 28 17:06:14 2014 +0000

----------------------------------------------------------------------
 .../integtestsupport/IsisSystemDefault.java     |   5 +-
 .../isis/core/metamodel/app/IsisMetaModel.java  |  17 +--
 .../facetapi/ClassSubstitutorFactory.java       |  32 -----
 ...tSpecIdFacetDerivedFromClassNameFactory.java |  10 +-
 .../specloader/ObjectReflectorDefault.java      |   2 -
 .../specloader/ObjectReflectorInstaller.java    |   4 +-
 .../classsubstitutor/ClassSubstitutor.java      |  85 ++++++++++--
 .../ClassSubstitutorAbstract.java               | 137 -------------------
 .../classsubstitutor/ClassSubstitutorAware.java |  25 ----
 .../ClassSubstitutorComposite.java              |  76 ----------
 .../JdoDiscriminatorAnnotationFacetFactory.java |  14 +-
 .../progmodels/dflt/JavaReflectorHelper.java    |  14 +-
 .../JavaReflectorInstallerNoDecorators.java     |  10 +-
 .../metamodel/app/IsisMetaModelTest_init.java   |  11 +-
 ...cIdFacetDerivedFromClassNameFactoryTest.java |   1 -
 .../ObjectReflectorDefaultTestAbstract.java     |   8 +-
 .../ClassSubstitutorAbstract_getClass.java      |  68 ---------
 .../ClassSubstitutorComposite_lifecycle.java    |  67 ---------
 .../ClassSubstitutor_getClass.java              |  67 +++++++++
 .../InMemoryPersistenceMechanismInstaller.java  |  42 ------
 ...ResolveAndObjectChangedEnhancerAbstract.java | 107 ---------------
 .../bytecode/dflt/ClassSubstitutorDefault.java  |  29 ----
 .../bytecode/dflt/ObjectFactoryBasic.java       |  54 --------
 .../PersistenceMechanismInstallerAbstract.java  |   5 +-
 .../PersistenceSessionFactoryDelegate.java      |   5 +-
 .../PersistenceSessionFactoryDelegating.java    |  16 +--
 .../objectfactory/ObjectFactoryAbstract.java    | 134 ------------------
 .../system/IsisSystemFixturesHookAbstract.java  |   3 +-
 .../system/persistence/ObjectFactory.java       |  76 +++++++++-
 .../system/persistence/PersistenceSession.java  |  40 ++----
 .../persistence/PersistenceSessionFactory.java  |   4 +-
 .../IsisSystemAbstract.java                     |   3 +-
 .../IsisSystemUsingInstallers.java              |   5 +-
 ...ataNucleusPersistenceMechanismInstaller.java |  14 --
 .../DataNucleusTypesClassSubstitutor.java       |  40 ------
 .../PersistenceSessionObjectStoreTest.java      |   2 +-
 36 files changed, 259 insertions(+), 973 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
index 70d0388..4b3b348 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
@@ -27,7 +27,6 @@ import com.google.common.collect.Sets;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;
-import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
@@ -126,13 +125,13 @@ public class IsisSystemDefault extends IsisSystemAbstract {
      * @see #obtainReflectorProgrammingModel()
      */
     @Override
-    protected SpecificationLoaderSpi obtainSpecificationLoaderSpi(DeploymentType deploymentType, ClassSubstitutorFactory classSubstitutorFactory, Collection<MetaModelRefiner> metaModelRefiners) throws IsisSystemException {
+    protected SpecificationLoaderSpi obtainSpecificationLoaderSpi(DeploymentType deploymentType, Collection<MetaModelRefiner> metaModelRefiners) throws IsisSystemException {
         
         final ProgrammingModel programmingModel = obtainReflectorProgrammingModel();
         final Set<FacetDecorator> facetDecorators = obtainReflectorFacetDecoratorSet();
         final MetaModelValidator mmv = obtainReflectorMetaModelValidator();
         
-        return JavaReflectorHelper.createObjectReflector(programmingModel, classSubstitutorFactory, metaModelRefiners, facetDecorators, mmv, getConfiguration());
+        return JavaReflectorHelper.createObjectReflector(programmingModel, metaModelRefiners, facetDecorators, mmv, getConfiguration());
     }
 
  

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
index 7ab73bd..404ad60 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.specloader.ObjectReflectorDefault;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutorAbstract;
 import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistry;
 import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistryDefault;
 import org.apache.isis.core.metamodel.specloader.traverser.SpecificationTraverser;
@@ -117,7 +116,9 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         this.services.addAll(Arrays.asList(services));
 
         setConfiguration(new IsisConfigurationDefault());
-        setClassSubstitutor(new ClassSubstitutorAbstract() {});
+
+        this.classSubstitutor = new ClassSubstitutor();
+
         setCollectionTypeRegistry(new CollectionTypeRegistryDefault());
         setSpecificationTraverser(new SpecificationTraverserDefault());
         setFacetDecorators(new TreeSet<FacetDecorator>());
@@ -225,18 +226,6 @@ public class IsisMetaModel implements ApplicationScopedComponent {
     }
 
     /**
-     * Optionally specify the {@link ClassSubstitutor}.
-     * 
-     * <p>
-     * Call prior to {@link #init()}.
-     */
-    public void setClassSubstitutor(final ClassSubstitutor classSubstitutor) {
-        ensureNotInitialized();
-        ensureThatArg(classSubstitutor, is(notNullValue()));
-        this.classSubstitutor = classSubstitutor;
-    }
-
-    /**
      * The {@link CollectionTypeRegistry} in force, either defaulted or
      * specified {@link #setCollectionTypeRegistry(CollectionTypeRegistry)
      * explicitly.}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/ClassSubstitutorFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/ClassSubstitutorFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/ClassSubstitutorFactory.java
deleted file mode 100644
index a222ea2..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/ClassSubstitutorFactory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facetapi;
-
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-
-
-/**
- * Provides the ability for components to inform/alter/adjust/refine the metamodel.
- */
-public interface ClassSubstitutorFactory {
-
-    ClassSubstitutor createClassSubstitutor(IsisConfiguration configuration);
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
index 50a54a6..31401ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
@@ -25,11 +25,10 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutorAware;
 
-public class ObjectSpecIdFacetDerivedFromClassNameFactory extends FacetFactoryAbstract implements ClassSubstitutorAware {
+public class ObjectSpecIdFacetDerivedFromClassNameFactory extends FacetFactoryAbstract {
 
-    private ClassSubstitutor classSubstitutor;
+    private ClassSubstitutor classSubstitutor = new ClassSubstitutor();
 
     public ObjectSpecIdFacetDerivedFromClassNameFactory() {
         super(FeatureType.OBJECTS_ONLY);
@@ -47,9 +46,4 @@ public class ObjectSpecIdFacetDerivedFromClassNameFactory extends FacetFactoryAb
         FacetUtil.addFacet(new ObjectSpecIdFacetDerivedFromClassName(substitutedClass.getCanonicalName(), facetHolder));
     }
 
-    @Override
-    public void setClassSubstitutor(ClassSubstitutor classSubstitutor) {
-        this.classSubstitutor = classSubstitutor;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index 32716d4..333f0fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -252,7 +252,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
 
         // initialize subcomponents
         facetDecoratorSet.init();
-        classSubstitutor.init();
         collectionTypeRegistry.init();
         specificationTraverser.init();
         programmingModel.init();
@@ -590,7 +589,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
             cast.setSpecificationLookup(this);
         }
 
-        getClassSubstitutor().injectInto(candidate);
         getCollectionTypeRegistry().injectInto(candidate);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
index c70866f..c3b42c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
@@ -20,9 +20,7 @@
 package org.apache.isis.core.metamodel.specloader;
 
 import java.util.Collection;
-
 import org.apache.isis.core.commons.components.Installer;
-import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 
@@ -33,7 +31,7 @@ public interface ObjectReflectorInstaller extends Installer {
 
     static String TYPE = "reflector";
 
-    SpecificationLoaderSpi createReflector(ClassSubstitutorFactory classSubstitutorFactory, Collection<MetaModelRefiner> metaModelRefiners);
+    SpecificationLoaderSpi createReflector(Collection<MetaModelRefiner> metaModelRefiners);
 
     void addFacetDecoratorInstaller(final FacetDecoratorInstaller decoratorInstaller);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
index cbbb869..c69fe9a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor.java
@@ -19,19 +19,86 @@
 
 package org.apache.isis.core.metamodel.specloader.classsubstitutor;
 
-import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.components.Injectable;
+import java.util.Set;
+import com.google.common.collect.Sets;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.commons.lang.ClassUtil;
 
 /**
  * Provides capability to translate or ignore classes.
- * 
- * <p>
- * The class strategy is typically required when either an underlying object
- * store (such as Hibernate); it then allows the enhancement artifacts can be
- * ignored or interpreted correctly.
  */
-public interface ClassSubstitutor extends Injectable, ApplicationScopedComponent {
+public class ClassSubstitutor {
+
+    //region > constructor
+
+    public ClassSubstitutor() {
+        ignore(DomainObjectContainer.class);
+
+        // ignore cglib
+        ignore("net.sf.cglib.proxy.Factory");
+        ignore("net.sf.cglib.proxy.MethodProxy");
+        ignore("net.sf.cglib.proxy.Callback");
+
+        // ignore javassist
+        ignore("javassist.util.proxy.ProxyObject");
+        ignore("javassist.util.proxy.MethodHandler");
+
+    }
+    //endregion
+
+    //region > getClass(Class)
+
+    public Class<?> getClass(final Class<?> cls) {
+
+        // ignore datanucleus proxies
+        if(cls.getName().startsWith("org.datanucleus")) {
+            return getClass(cls.getSuperclass());
+        }
+
+        if (shouldIgnore(cls)) {
+            return null;
+        }
+        final Class<?> superclass = cls.getSuperclass();
+        if(superclass != null && superclass.isEnum()) {
+            return superclass;
+        }
+        if (ClassUtil.directlyImplements(cls, JavassistEnhanced.class)) {
+            return getClass(cls.getSuperclass());
+        }
+        return cls;
+    }
+
+    //endregion
+
+    //region > helpers
+
+    private final Set<Class<?>> classesToIgnore = Sets.newHashSet();
+    private final Set<String> classNamesToIgnore = Sets.newHashSet();
+
+    /**
+     * For any classes registered as ignored, {@link #getClass(Class)} will
+     * return <tt>null</tt>.
+     */
+    private boolean ignore(final Class<?> q) {
+        return classesToIgnore.add(q);
+    }
+
+    /**
+     * For any classes registered as ignored, {@link #getClass(Class)} will
+     * return <tt>null</tt>.
+     */
+    private boolean ignore(final String className) {
+        return classNamesToIgnore.add(className);
+    }
+
+    private boolean shouldIgnore(final Class<?> cls) {
+        if (cls.isArray()) {
+            return shouldIgnore(cls.getComponentType());
+        }
+        return classesToIgnore.contains(cls) || classNamesToIgnore.contains(cls.getCanonicalName());
+    }
+
+    //endregion
 
-    Class<?> getClass(Class<?> cls);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract.java
deleted file mode 100644
index 761d64f..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.classsubstitutor;
-
-import java.util.Set;
-
-import com.google.common.collect.Sets;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.commons.lang.ClassUtil;
-
-public abstract class ClassSubstitutorAbstract implements ClassSubstitutor {
-
-    private final Set<Class<?>> classesToIgnore = Sets.newHashSet();
-    private final Set<String> classNamesToIgnore = Sets.newHashSet();
-
-    /**
-     * Will implicitly ignore the {@link DomainObjectContainer}.
-     */
-    public ClassSubstitutorAbstract() {
-        ignore(DomainObjectContainer.class);
-        
-        // ignore cglib
-        ignore("net.sf.cglib.proxy.Factory");
-        ignore("net.sf.cglib.proxy.MethodProxy");
-        ignore("net.sf.cglib.proxy.Callback");
-
-        // ignore javassist
-        ignore("javassist.util.proxy.ProxyObject");
-        ignore("javassist.util.proxy.MethodHandler");
-
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // init, shutdown
-    // /////////////////////////////////////////////////////////////////
-
-    /**
-     * Default implementation does nothing.
-     */
-    @Override
-    public void init() {
-    }
-
-    /**
-     * Default implementation does nothing.
-     */
-    @Override
-    public void shutdown() {
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // ClassSubstitutor impl.
-    // /////////////////////////////////////////////////////////////////
-
-    /**
-     * Hook method for subclasses to override if required.
-     * 
-     * <p>
-     * Default implementation will either return the class, unless has been
-     * registered as to be {@link #ignore(Class) ignore}d, in which case returns
-     * <tt>null</tt>.
-     */
-    @Override
-    public Class<?> getClass(final Class<?> cls) {
-        if (shouldIgnore(cls)) {
-            return null;
-        }
-        final Class<?> superclass = cls.getSuperclass();
-        if(superclass != null && superclass.isEnum()) {
-            return superclass;
-        }
-        if (ClassUtil.directlyImplements(cls, JavassistEnhanced.class)) {
-            return getClass(cls.getSuperclass());
-        }
-        return cls;
-    }
-
-    
-    private boolean shouldIgnore(final Class<?> cls) {
-        if (cls.isArray()) {
-            return shouldIgnore(cls.getComponentType());
-        }
-        return classesToIgnore.contains(cls) || classNamesToIgnore.contains(cls.getCanonicalName());
-    }
-
-    // ////////////////////////////////////////////////////////////////////
-    // ignoring
-    // ////////////////////////////////////////////////////////////////////
-
-    /**
-     * For any classes registered as ignored, {@link #getClass(Class)} will
-     * return <tt>null</tt>.
-     */
-    protected boolean ignore(final Class<?> q) {
-        return classesToIgnore.add(q);
-    }
-
-    /**
-     * For any classes registered as ignored, {@link #getClass(Class)} will
-     * return <tt>null</tt>.
-     */
-    protected boolean ignore(final String className) {
-        return classNamesToIgnore.add(className);
-    }
-
-
-    // ////////////////////////////////////////////////////////////////////
-    // injectInto
-    // ////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void injectInto(final Object candidate) {
-        if (ClassSubstitutorAware.class.isAssignableFrom(candidate.getClass())) {
-            final ClassSubstitutorAware cast = ClassSubstitutorAware.class.cast(candidate);
-            cast.setClassSubstitutor(this);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAware.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAware.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAware.java
deleted file mode 100644
index 132d5bc..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAware.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.classsubstitutor;
-
-public interface ClassSubstitutorAware {
-
-    public void setClassSubstitutor(ClassSubstitutor classSubstitutor);
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite.java
deleted file mode 100644
index 43e0d88..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.classsubstitutor;
-
-import java.util.Arrays;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-public class ClassSubstitutorComposite implements ClassSubstitutor {
-
-    private final List<ClassSubstitutor> substitutors = Lists.newArrayList();
-
-    public ClassSubstitutorComposite(final List<ClassSubstitutor> substitutors) {
-        this.substitutors.addAll(substitutors);
-    }
-
-    public ClassSubstitutorComposite(final ClassSubstitutor... substitutors) {
-        this(Arrays.asList(substitutors));
-    }
-
-    @Override
-    public void init() {
-        for (final ClassSubstitutor classSubstitutor : substitutors) {
-            classSubstitutor.init();
-        }
-    }
-
-    @Override
-    public void shutdown() {
-        for (final ClassSubstitutor classSubstitutor : substitutors) {
-            classSubstitutor.shutdown();
-        }
-    }
-
-    @Override
-    public Class<?> getClass(Class<?> cls) {
-        Class<?> clsBefore;
-        do {
-            clsBefore = cls;
-            for (final ClassSubstitutor substitutor : substitutors) {
-                cls = substitutor.getClass(cls);
-                if (cls == null) {
-                    return null;
-                }
-            }
-        } while (clsBefore != cls);
-        return cls;
-    }
-
-    @Override
-    public void injectInto(final Object candidate) {
-        if (ClassSubstitutorAware.class.isAssignableFrom(candidate.getClass())) {
-            final ClassSubstitutorAware cast = ClassSubstitutorAware.class.cast(candidate);
-            cast.setClassSubstitutor(this);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
index a98ebbe..bde6dc9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
@@ -20,21 +20,18 @@
 package org.apache.isis.objectstore.jdo.metamodel.facets.object.discriminator;
 
 import javax.jdo.annotations.Discriminator;
-
 import com.google.common.base.Strings;
-
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutorAware;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.classname.ObjectSpecIdFacetDerivedFromClassName;
+import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 
-public class JdoDiscriminatorAnnotationFacetFactory extends FacetFactoryAbstract implements ClassSubstitutorAware  {
+public class JdoDiscriminatorAnnotationFacetFactory extends FacetFactoryAbstract {
 
-    private ClassSubstitutor classSubstitutor;
+    private ClassSubstitutor classSubstitutor = new ClassSubstitutor();
 
     public JdoDiscriminatorAnnotationFacetFactory() {
         super(FeatureType.OBJECTS_ONLY);
@@ -60,9 +57,4 @@ public class JdoDiscriminatorAnnotationFacetFactory extends FacetFactoryAbstract
         FacetUtil.addFacet(new JdoDiscriminatorFacetDefault(annotationValueAttribute, processClassContext.getFacetHolder()));
     }
 
-    @Override
-    public void setClassSubstitutor(ClassSubstitutor classSubstitutor) {
-        this.classSubstitutor = classSubstitutor;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
index 8b5bcb5..3a12dd2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
@@ -26,7 +26,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
@@ -48,15 +47,14 @@ public final class JavaReflectorHelper  {
     private JavaReflectorHelper(){}
     
     public static SpecificationLoaderSpi createObjectReflector(
-                                                           final ProgrammingModel programmingModel,
-                                                           final ClassSubstitutorFactory classSubstitutorFactory,
-                                                           final Collection<MetaModelRefiner> metaModelRefiners,
-                                                           final Set<FacetDecorator> facetDecorators,
-                                                           final MetaModelValidator mmv, 
-                                                           final IsisConfiguration configuration) {
+            final ProgrammingModel programmingModel,
+            final Collection<MetaModelRefiner> metaModelRefiners,
+            final Set<FacetDecorator> facetDecorators,
+            final MetaModelValidator mmv,
+            final IsisConfiguration configuration) {
         final SpecificationTraverser specificationTraverser = new SpecificationTraverserDefault();
         final CollectionTypeRegistry collectionTypeRegistry = new CollectionTypeRegistryDefault();
-        final ClassSubstitutor classSubstitutor = classSubstitutorFactory.createClassSubstitutor(configuration);
+        final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
         
         MetaModelValidatorComposite metaModelValidator = MetaModelValidatorComposite.asComposite(mmv);
         for (MetaModelRefiner metaModelRefiner : metaModelRefiners) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
index 86684f9..24bc810 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
@@ -34,7 +34,6 @@ import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.InstallerAbstract;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
-import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
@@ -74,19 +73,14 @@ public class JavaReflectorInstallerNoDecorators extends InstallerAbstract implem
     // createReflector, doCreateReflector
     // /////////////////////////////////////////////////////
 
-    /**
-     * Should call
-     * {@link #addFacetDecoratorInstaller(ReflectorDecoratorInstaller)} prior to
-     * calling this.
-     */
     @Override
-    public SpecificationLoaderSpi createReflector(final ClassSubstitutorFactory classSubstitutorFactory, final Collection<MetaModelRefiner> metaModelRefiners) {
+    public SpecificationLoaderSpi createReflector(final Collection<MetaModelRefiner> metaModelRefiners) {
 
         final ProgrammingModel programmingModel = createProgrammingModel(getConfiguration());
         final Set<FacetDecorator> facetDecorators = createFacetDecorators(getConfiguration());
         final MetaModelValidator mmv = createMetaModelValidator(getConfiguration());
         
-        return JavaReflectorHelper.createObjectReflector(programmingModel, classSubstitutorFactory, metaModelRefiners, facetDecorators, mmv, getConfiguration());
+        return JavaReflectorHelper.createObjectReflector(programmingModel, metaModelRefiners, facetDecorators, mmv, getConfiguration());
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
index 3fc502a..fb7e0eb 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
@@ -71,18 +71,19 @@ public class IsisMetaModelTest_init {
     @Mock
     private FacetDecorator mockFacetDecorator;
     @Mock
-    private ClassSubstitutor mockClassSubstitutor;
-    @Mock
     private CollectionTypeRegistry mockCollectionTypeRegistry;
     @Mock
     private RuntimeContext mockRuntimeContext;
 
+    private ClassSubstitutor classSubstitutor;
+
     private IsisMetaModel metaModel;
 
     @Before
     public void setUp() {
         expectingMetaModelToBeInitialized();
         metaModel = new IsisMetaModel(mockRuntimeContext, mockProgrammingModelFacets);
+        classSubstitutor = new ClassSubstitutor();
     }
 
     private void expectingMetaModelToBeInitialized() {
@@ -153,12 +154,6 @@ public class IsisMetaModelTest_init {
     }
 
     @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeClassSubstitutor() {
-        metaModel.init();
-        metaModel.setClassSubstitutor(mockClassSubstitutor);
-    }
-
-    @Test(expected = IllegalStateException.class)
     public void shouldNotBeAbleToChangeFacetDecorators() {
         metaModel.init();
         metaModel.setFacetDecorators(new TreeSet<FacetDecorator>());

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/objectspecid/ObjectSpecIdFacetDerivedFromClassNameFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/objectspecid/ObjectSpecIdFacetDerivedFromClassNameFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/objectspecid/ObjectSpecIdFacetDerivedFromClassNameFactoryTest.java
index 5eff3d2..ce5bd98 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/objectspecid/ObjectSpecIdFacetDerivedFromClassNameFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/objectspecid/ObjectSpecIdFacetDerivedFromClassNameFactoryTest.java
@@ -44,7 +44,6 @@ public class ObjectSpecIdFacetDerivedFromClassNameFactoryTest extends AbstractFa
     public void setUp() throws Exception {
         facetFactory = new ObjectSpecIdFacetDerivedFromClassNameFactory();
         facetFactory.setSpecificationLookup(mockSpecificationLoaderSpi);
-        facetFactory.setClassSubstitutor(mockClassSubstitutor);
     }
 
     static class Customer {

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
index c013d06..6082cd8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
@@ -30,17 +30,17 @@ import org.junit.Test;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
 import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutorAbstract;
+import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistryDefault;
 import org.apache.isis.core.metamodel.specloader.traverser.SpecificationTraverserDefault;
 import org.apache.isis.core.unittestsupport.jmocking.InjectIntoJMockAction;
@@ -78,7 +78,7 @@ public abstract class ObjectReflectorDefaultTestAbstract {
         final ObjectReflectorDefault reflector = 
                 new ObjectReflectorDefault(
                         mockConfiguration, 
-                        new ClassSubstitutorAbstract() {}, 
+                        new ClassSubstitutor(),
                         new CollectionTypeRegistryDefault(), 
                         new SpecificationTraverserDefault(), 
                         new ProgrammingModelFacetsJava5(),

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract_getClass.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract_getClass.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract_getClass.java
deleted file mode 100644
index b887c49..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorAbstract_getClass.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.classsubstitutor;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class ClassSubstitutorAbstract_getClass {
-
-    private ClassSubstitutorAbstract classSubstitutorAbstract;
-
-    @Before
-    public void setUp() throws Exception {
-        classSubstitutorAbstract = new ClassSubstitutorAbstract() {
-        };
-    }
-    
-    public static class SomeDomainObject {
-        
-        public static enum SomeEnum {
-            Foo {
-                @Override
-                public void x() {
-                }
-            };
-            public abstract void x();
-        }
-    }
-    
-    @Test
-    public void regularDomainObject() throws Exception {
-        Class<?> cls = classSubstitutorAbstract.getClass(SomeDomainObject.class);
-        assertEquals(SomeDomainObject.class, cls);
-    }
-
-    @Test
-    public void someEnum() throws Exception {
-        Class<?> cls = classSubstitutorAbstract.getClass(SomeDomainObject.SomeEnum.class);
-        assertEquals(SomeDomainObject.SomeEnum.class, cls);
-    }
-
-    @Test
-    public void someAnonymousSubtypeOfEnum() throws Exception {
-        Class<?> cls = classSubstitutorAbstract.getClass(SomeDomainObject.SomeEnum.Foo.getClass());
-        assertEquals(SomeDomainObject.SomeEnum.class, cls);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite_lifecycle.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite_lifecycle.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite_lifecycle.java
deleted file mode 100644
index 3416522..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutorComposite_lifecycle.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.classsubstitutor;
-
-import org.jmock.Expectations;
-import org.jmock.Mockery;
-import org.jmock.integration.junit4.JMock;
-import org.jmock.integration.junit4.JUnit4Mockery;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(JMock.class)
-public class ClassSubstitutorComposite_lifecycle {
-
-    private final Mockery context = new JUnit4Mockery();
-
-    final ClassSubstitutor mockSubstitutor = context.mock(ClassSubstitutor.class, "one");
-    final ClassSubstitutor mockSubstitutor2 = context.mock(ClassSubstitutor.class, "two");
-
-    private ClassSubstitutorComposite classSubstitutorComposite;
-
-    @Before
-    public void setUp() throws Exception {
-        classSubstitutorComposite = new ClassSubstitutorComposite(mockSubstitutor, mockSubstitutor2);
-    }
-
-    @Test
-    public void whenInitThenShouldPropogate() throws Exception {
-        context.checking(new Expectations() {
-            {
-                one(mockSubstitutor).init();
-                one(mockSubstitutor2).init();
-            }
-        });
-        classSubstitutorComposite.init();
-    }
-
-    @Test
-    public void whenShutdownThenShouldPropogate() throws Exception {
-        context.checking(new Expectations() {
-            {
-                one(mockSubstitutor).shutdown();
-                one(mockSubstitutor2).shutdown();
-            }
-        });
-        classSubstitutorComposite.shutdown();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor_getClass.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor_getClass.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor_getClass.java
new file mode 100644
index 0000000..016a61c
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/classsubstitutor/ClassSubstitutor_getClass.java
@@ -0,0 +1,67 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.specloader.classsubstitutor;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ClassSubstitutor_getClass {
+
+    private ClassSubstitutor classSubstitutor;
+
+    @Before
+    public void setUp() throws Exception {
+        classSubstitutor = new ClassSubstitutor();
+    }
+    
+    public static class SomeDomainObject {
+        
+        public static enum SomeEnum {
+            Foo {
+                @Override
+                public void x() {
+                }
+            };
+            public abstract void x();
+        }
+    }
+    
+    @Test
+    public void regularDomainObject() throws Exception {
+        Class<?> cls = classSubstitutor.getClass(SomeDomainObject.class);
+        assertEquals(SomeDomainObject.class, cls);
+    }
+
+    @Test
+    public void someEnum() throws Exception {
+        Class<?> cls = classSubstitutor.getClass(SomeDomainObject.SomeEnum.class);
+        assertEquals(SomeDomainObject.SomeEnum.class, cls);
+    }
+
+    @Test
+    public void someAnonymousSubtypeOfEnum() throws Exception {
+        Class<?> cls = classSubstitutor.getClass(SomeDomainObject.SomeEnum.Foo.getClass());
+        assertEquals(SomeDomainObject.SomeEnum.class, cls);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java
index e23b93f..2f0acc2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java
@@ -19,14 +19,9 @@
 
 package org.apache.isis.core.objectstore;
 
-import java.lang.reflect.Modifier;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
-import org.apache.isis.core.metamodel.spec.ObjectInstantiationException;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-import org.apache.isis.core.runtime.bytecode.dflt.ClassSubstitutorDefault;
 import org.apache.isis.core.runtime.installerregistry.installerapi.PersistenceMechanismInstallerAbstract;
-import org.apache.isis.core.runtime.persistence.objectfactory.ObjectFactoryAbstract;
 import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.persistence.AdapterManagerSpi;
@@ -66,45 +61,8 @@ public class InMemoryPersistenceMechanismInstaller extends PersistenceMechanismI
     }
 
     
-    @Override
-    public ObjectFactory createObjectFactory(IsisConfiguration configuration) {
-        return new ObjectFactoryBasic();
-    }
-
-    @Override
-    public ClassSubstitutor createClassSubstitutor(IsisConfiguration configuration) {
-        return new ClassSubstitutorDefault();
-    }
 
 
 }
 
 
-class ObjectFactoryBasic extends ObjectFactoryAbstract {
-
-    public ObjectFactoryBasic() {
-    }
-
-    public ObjectFactoryBasic(final Mode mode) {
-        super(mode);
-    }
-
-    /**
-     * Simply instantiates reflectively, does not enhance bytecode etc in any
-     * way.
-     */
-    @Override
-    protected <T> T doInstantiate(final Class<T> cls) throws ObjectInstantiationException {
-        if (Modifier.isAbstract(cls.getModifiers())) {
-            throw new ObjectInstantiationException("Cannot create an instance of an abstract class: " + cls);
-        }
-        try {
-            return cls.newInstance();
-        } catch (final IllegalAccessException e) {
-            throw new ObjectInstantiationException(e);
-        } catch (final InstantiationException e) {
-            throw new ObjectInstantiationException(e);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/ObjectResolveAndObjectChangedEnhancerAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/ObjectResolveAndObjectChangedEnhancerAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/ObjectResolveAndObjectChangedEnhancerAbstract.java
deleted file mode 100644
index 1489110..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/ObjectResolveAndObjectChangedEnhancerAbstract.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.bytecode;
-
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-
-import java.lang.reflect.Method;
-
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
-import org.apache.isis.core.runtime.persistence.objectfactory.ObjectChanger;
-import org.apache.isis.core.runtime.persistence.objectfactory.ObjectResolver;
-
-public abstract class ObjectResolveAndObjectChangedEnhancerAbstract {
-
-    protected final ObjectResolver objectResolver;
-    protected final ObjectChanger objectChanger;
-    protected final SpecificationLoaderSpi specificationLoader;
-
-    public ObjectResolveAndObjectChangedEnhancerAbstract(final ObjectResolver objectResolver, final ObjectChanger objectChanger, final SpecificationLoaderSpi specificationLoader) {
-        ensureThatArg(objectResolver, is(notNullValue()));
-        ensureThatArg(objectChanger, is(notNullValue()));
-        ensureThatArg(specificationLoader, is(notNullValue()));
-
-        this.objectResolver = objectResolver;
-        this.objectChanger = objectChanger;
-        this.specificationLoader = specificationLoader;
-    }
-
-    /**
-     * Subclasses should call from their constructor, and setup their
-     * implementation-specific callback mechanism.
-     */
-    protected abstract void createCallback();
-
-    protected ObjectSpecificationDefault getJavaSpecificationOfOwningClass(final Method method) {
-        return getJavaSpecification(method.getDeclaringClass());
-    }
-
-    protected ObjectSpecificationDefault getJavaSpecification(final Class<?> cls) {
-        final ObjectSpecification nos = getSpecification(cls);
-        if (!(nos instanceof ObjectSpecificationDefault)) {
-            throw new UnsupportedOperationException("Only Java is supported (specification is '" + nos.getClass().getCanonicalName() + "')");
-        }
-        return (ObjectSpecificationDefault) nos;
-    }
-
-    protected boolean impliesResolve(final ImperativeFacet[] imperativeFacets) {
-        for (final ImperativeFacet imperativeFacet : imperativeFacets) {
-            if (imperativeFacet.impliesResolve()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    protected boolean impliesObjectChanged(final ImperativeFacet[] imperativeFacets) {
-        for (final ImperativeFacet imperativeFacet : imperativeFacets) {
-            if (imperativeFacet.impliesObjectChanged()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private ObjectSpecification getSpecification(final Class<?> type) {
-        return specificationLoader.loadSpecification(type);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Dependencies (from constructor)
-    // /////////////////////////////////////////////////////////////
-
-    public final ObjectResolver getObjectResolver() {
-        return objectResolver;
-    }
-
-    public final ObjectChanger getObjectChanger() {
-        return objectChanger;
-    }
-
-    public final SpecificationLoaderSpi getSpecificationLoader() {
-        return specificationLoader;
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ClassSubstitutorDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ClassSubstitutorDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ClassSubstitutorDefault.java
deleted file mode 100644
index 05ef574..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ClassSubstitutorDefault.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.bytecode.dflt;
-
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutorAbstract;
-
-public class ClassSubstitutorDefault extends ClassSubstitutorAbstract {
-
-    public ClassSubstitutorDefault() {
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ObjectFactoryBasic.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ObjectFactoryBasic.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ObjectFactoryBasic.java
deleted file mode 100644
index 7ad7742..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/bytecode/dflt/ObjectFactoryBasic.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.bytecode.dflt;
-
-import java.lang.reflect.Modifier;
-
-import org.apache.isis.core.metamodel.spec.ObjectInstantiationException;
-import org.apache.isis.core.runtime.persistence.objectfactory.ObjectFactoryAbstract;
-
-public class ObjectFactoryBasic extends ObjectFactoryAbstract {
-
-    public ObjectFactoryBasic() {
-    }
-
-    public ObjectFactoryBasic(final Mode mode) {
-        super(mode);
-    }
-
-    /**
-     * Simply instantiates reflectively, does not enhance bytecode etc in any
-     * way.
-     */
-    @Override
-    protected <T> T doInstantiate(final Class<T> cls) throws ObjectInstantiationException {
-        if (Modifier.isAbstract(cls.getModifiers())) {
-            throw new ObjectInstantiationException("Cannot create an instance of an abstract class: " + cls);
-        }
-        try {
-            return cls.newInstance();
-        } catch (final IllegalAccessException e) {
-            throw new ObjectInstantiationException(e);
-        } catch (final InstantiationException e) {
-            throw new ObjectInstantiationException(e);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
index f8deedf..99feccb 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
@@ -35,7 +35,6 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookupAware;
-import org.apache.isis.core.runtime.persistence.PersistenceConstants;
 import org.apache.isis.core.runtime.persistence.PersistenceSessionFactoryDelegating;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapterFactory;
 import org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault;
@@ -110,7 +109,6 @@ public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbs
         }
 
         ObjectAdapterFactory adapterFactory = persistenceSessionFactory.getAdapterFactory();
-        ObjectFactory objectFactory = persistenceSessionFactory.getObjectFactory();
         PojoRecreator pojoRecreator = persistenceSessionFactory.getPojoRecreator();
         IdentifierGenerator identifierGenerator = persistenceSessionFactory.getIdentifierGenerator();
         ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
@@ -129,7 +127,7 @@ public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbs
         }
         
         final PersistenceSession persistenceSession = 
-                new PersistenceSession(persistenceSessionFactory, adapterFactory, objectFactory, servicesInjector, identifierGenerator, adapterManager, persistAlgorithm, objectStore);
+                new PersistenceSession(persistenceSessionFactory, adapterFactory, servicesInjector, identifierGenerator, adapterManager, persistAlgorithm, objectStore);
         
         final IsisTransactionManager transactionManager = createTransactionManager(persistenceSession, objectStore, servicesInjector);
         
@@ -276,7 +274,6 @@ public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbs
     }
 
 
-
     // /////////////////////////////////////////////////////
     // Dependencies (from setters)
     // /////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
index 20742cf..9cbc2e0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.runtime.persistence;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderAware;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
-import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
@@ -36,7 +35,7 @@ import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory
  * Creates a {@link PersistenceSession} on behalf of a
  * {@link PersistenceSessionFactory}.
  */
-public interface PersistenceSessionFactoryDelegate extends IsisConfigurationBuilderAware, ClassSubstitutorFactory, MetaModelRefiner {
+public interface PersistenceSessionFactoryDelegate extends IsisConfigurationBuilderAware, MetaModelRefiner {
 
 
     ///////////////////////////////////////////////////////////////////////////
@@ -47,8 +46,6 @@ public interface PersistenceSessionFactoryDelegate extends IsisConfigurationBuil
 
     ObjectAdapterFactory createAdapterFactory(IsisConfiguration configuration);
 
-    ObjectFactory createObjectFactory(IsisConfiguration configuration);
-
     IdentifierGenerator createIdentifierGenerator(IsisConfiguration configuration);
 
     ServicesInjectorSpi createServicesInjector(IsisConfiguration configuration);

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
index 2efacc2..45284cc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
@@ -28,13 +28,11 @@ import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.runtime.persistence.adaptermanager.PojoRecreator;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.IdentifierGenerator;
-import org.apache.isis.core.runtime.system.persistence.ObjectFactory;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 
@@ -57,10 +55,9 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     private List<Object> serviceList;
 
     private Boolean fixturesInstalled;
-    
+
     private PojoRecreator pojoRecreator;
     private ObjectAdapterFactory adapterFactory;
-    private ObjectFactory objectFactory;
     private IdentifierGenerator identifierGenerator;
     private ServicesInjectorSpi servicesInjector;
     private RuntimeContext runtimeContext;
@@ -107,12 +104,10 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
 
         pojoRecreator = persistenceSessionFactoryDelegate.createPojoRecreator(getConfiguration());
         adapterFactory = persistenceSessionFactoryDelegate.createAdapterFactory(getConfiguration());
-        objectFactory = persistenceSessionFactoryDelegate.createObjectFactory(getConfiguration());
         identifierGenerator = persistenceSessionFactoryDelegate.createIdentifierGenerator(getConfiguration());
 
         ensureThatState(pojoRecreator, is(not(nullValue())));
         ensureThatState(adapterFactory, is(not(nullValue())));
-        ensureThatState(objectFactory, is(not(nullValue())));
         ensureThatState(identifierGenerator, is(not(nullValue())));
 
         servicesInjector = persistenceSessionFactoryDelegate.createServicesInjector(getConfiguration());
@@ -162,10 +157,6 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
         return identifierGenerator;
     }
     
-    public ObjectFactory getObjectFactory() {
-        return objectFactory;
-    }
-    
     public PojoRecreator getPojoRecreator() {
         return pojoRecreator;
     }
@@ -183,11 +174,6 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     // //////////////////////////////////////////////////////
 
     @Override
-    public ClassSubstitutor createClassSubstitutor(final IsisConfiguration configuration) {
-        return persistenceSessionFactoryDelegate.createClassSubstitutor(configuration);
-    }
-
-    @Override
     public void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator, IsisConfiguration configuration) {
         persistenceSessionFactoryDelegate.refineMetaModelValidator(metaModelValidator, configuration);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectfactory/ObjectFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectfactory/ObjectFactoryAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectfactory/ObjectFactoryAbstract.java
deleted file mode 100644
index 8edd371..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectfactory/ObjectFactoryAbstract.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.persistence.objectfactory;
-
-import java.lang.reflect.Modifier;
-
-import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.metamodel.spec.ObjectInstantiationException;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpiAware;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.ObjectFactory;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
-/**
- * Abstract adapter for {@link ObjectFactory}.
- * 
- * <p>
- * Implementation note: rather than use the <tt>*Aware</tt> interfaces, we
- * instead look up dependencies from the {@link IsisContext}. This is necessary,
- * for the {@link PersistenceSession} at least, because class enhancers may hold
- * a reference to the factory as part of the generated bytecode. Since the
- * {@link PersistenceSession} could change over the lifetime of the instance (eg
- * when using the {@link InMemoryObjectStore}), we must always look the
- * {@link PersistenceSession} from the {@link IsisContext}. The same applies to
- * the {@link ServicesInjectorSpi}.
- * 
- * <p>
- * In theory it would be possible to cache the {@link SpecificationLoaderSpi} and
- * inject using {@link SpecificationLoaderSpiAware}, but since we are already using
- * the {@link IsisContext}, decided instead to use the same approach throughout.
- */
-public abstract class ObjectFactoryAbstract implements ObjectFactory {
-
-    private final Mode mode;
-
-    public enum Mode {
-        /**
-         * Fail if no {@link ObjectAdapterPersistor} has been injected.
-         */
-        STRICT,
-        /**
-         * Ignore if no {@link ObjectAdapterPersistor} has been injected
-         * (intended for testing only).
-         */
-        RELAXED
-    }
-
-    public ObjectFactoryAbstract() {
-        this(Mode.STRICT);
-    }
-
-    public ObjectFactoryAbstract(final Mode mode) {
-        this.mode = mode;
-    }
-
-    @Override
-    public <T> T instantiate(final Class<T> cls) throws ObjectInstantiationException {
-
-        if (mode == Mode.STRICT && getServicesInjector() == null) {
-            throw new IllegalStateException("ServicesInjector has not been injected into ObjectFactory");
-        }
-        if (Modifier.isAbstract(cls.getModifiers())) {
-            throw new ObjectInstantiationException("Cannot create an instance of an abstract class: " + cls);
-        }
-        final T newInstance = doInstantiate(cls);
-
-        if (getServicesInjector() != null) {
-            getServicesInjector().injectServicesInto(newInstance);
-        }
-        return newInstance;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // open, close
-    // /////////////////////////////////////////////////////////////////
-
-    /**
-     * Default implementation does nothing.
-     */
-    @Override
-    public void open() {
-    }
-
-    /**
-     * Default implementation does nothing.
-     */
-    @Override
-    public void close() {
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // doInstantiate
-    // /////////////////////////////////////////////////////////////////
-
-    /**
-     * Hook method for subclasses to override.
-     */
-    protected abstract <T> T doInstantiate(Class<T> cls) throws ObjectInstantiationException;
-
-    // /////////////////////////////////////////////////////////////////
-    // Dependencies (looked up from context)
-    // /////////////////////////////////////////////////////////////////
-
-    protected SpecificationLoaderSpi getSpecificationLoader() {
-        return IsisContext.getSpecificationLoader();
-    }
-
-    protected PersistenceSession getPersistenceSession() {
-        return IsisContext.getPersistenceSession();
-    }
-
-    protected ServicesInjectorSpi getServicesInjector() {
-        return getPersistenceSession().getServicesInjector();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
index 4e09735..7f4aa22 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
@@ -29,7 +29,6 @@ import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
@@ -256,7 +255,7 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
     // Reflector
     // ///////////////////////////////////////////
 
-    protected abstract SpecificationLoaderSpi obtainSpecificationLoaderSpi(DeploymentType deploymentType, ClassSubstitutorFactory classSubstitutorFactory, Collection<MetaModelRefiner> metaModelRefiners) throws IsisSystemException;
+    protected abstract SpecificationLoaderSpi obtainSpecificationLoaderSpi(DeploymentType deploymentType, Collection<MetaModelRefiner> metaModelRefiners) throws IsisSystemException;
 
     // ///////////////////////////////////////////
     // PersistenceSessionFactory

http://git-wip-us.apache.org/repos/asf/isis/blob/a22b88f9/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectFactory.java
index a7d5614..332eca6 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectFactory.java
@@ -19,15 +19,79 @@
 
 package org.apache.isis.core.runtime.system.persistence;
 
-import org.apache.isis.core.commons.components.SessionScopedComponent;
+import java.lang.reflect.Modifier;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.spec.ObjectInstantiationException;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 
-public interface ObjectFactory extends SessionScopedComponent {
+public class ObjectFactory {
+
+    private final Mode mode;
+
+    public enum Mode {
+        /**
+         * Fail if no {@link ObjectFactory#getServicesInjector() services injector} has been injected.
+         */
+        STRICT,
+        /**
+         * Ignore if no {@link ObjectFactory#getServicesInjector() services injector} has been injected
+         * (intended for testing only).
+         */
+        RELAXED
+    }
+
+    public ObjectFactory() {
+        this(Mode.STRICT);
+    }
+
+    public ObjectFactory(final Mode mode) {
+        this.mode = mode;
+    }
+
+    public <T> T instantiate(final Class<T> cls) throws ObjectInstantiationException {
+
+        if (mode == Mode.STRICT && getServicesInjector() == null) {
+            throw new IllegalStateException("ServicesInjector is not available (no open session)");
+        }
+        if (Modifier.isAbstract(cls.getModifiers())) {
+            throw new ObjectInstantiationException("Cannot create an instance of an abstract class: " + cls);
+        }
+        final T newInstance = doInstantiate(cls);
+
+        if (getServicesInjector() != null) {
+            getServicesInjector().injectServicesInto(newInstance);
+        }
+        return newInstance;
+    }
+
+
+    //region > doInstantiate
 
     /**
-     * Should instantiate the object, and in addition initialize the domain
-     * object (for example, inject any services and repositories into it).
-     * 
+     * Simply instantiates reflectively.
      */
-    <T> T instantiate(Class<T> cls) throws ObjectInstantiationException;
+    protected <T> T doInstantiate(final Class<T> cls) throws ObjectInstantiationException {
+        if (Modifier.isAbstract(cls.getModifiers())) {
+            throw new ObjectInstantiationException("Cannot create an instance of an abstract class: " + cls);
+        }
+        try {
+            return cls.newInstance();
+        } catch (final IllegalAccessException | InstantiationException e) {
+            throw new ObjectInstantiationException(e);
+        }
+    }
+    //endregion
+
+    //region > dependencies (looked up from context)
+
+    private PersistenceSession getPersistenceSession() {
+        return IsisContext.getPersistenceSession();
+    }
+
+    protected ServicesInjectorSpi getServicesInjector() {
+        return getPersistenceSession().getServicesInjector();
+    }
+
+    //endregion
+
 }