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 2015/09/16 07:06:38 UTC

[4/4] isis git commit: ISIS-1194: simplfying the bootstrap and wiring of components, in particular around PersistenceSessionFactory

ISIS-1194: simplfying the bootstrap and wiring of components, in particular around PersistenceSessionFactory

specifically:
- IsisSessionFactory
  - now passed in the ServicesInjector (rather than obtaining it from the PersistenceSessionFactory)
  - initialization of FixtureClock done in IsisSessionFactory rather than PersistenceSessionFactory
- IsisSystem
  - createSessionFactory(), changed the order in order to remove some bidir relationships
  - in shutdownServices, avoid NPE if the serviceInitializer was never instantiated during init()
- PersistenceSessionFactory
- no longer implements MetaModelRefiner, instead moved out to separate class (PersistenceSessionFactoryMetamodelRefiner)
    - this allows us to break the bidir between PersistenceSessionFactory and SpecificationLoader
  - no longer requires a RuntimeContext
  - no longer requires a ServicesInjector (is provided by IsisSessionFactory when #createPersistenceSession() is called to pass onto the created PersistenceSession)
  - no longer implements SpecificationLoaderAware, nor requires a SpecificationLoader (is provided by IsisSessionFactory when #createPerisistenceSession is called)
- similar changes to IsisMetaModel, in its constructor an init() method, to wire up components in the correct order
- PersistenceSession
  - no longer holds reference to PersistenceSessionFactory (though does only as FixturesInstallerFlag in order that PSF can continue to cache whether fixtures installed)
  - is passed in the JDO PersistenceManagerFactory from Isis' PSF (rather than accessing the PSF's DataNucleusApplicationComponents, which is now wholly internal to PSF)
  - is passed in the ServicesInjector directly (rather than obtain from Isis' PSF)
- RuntimeContextAbstract
  - now also passed in SpecificationLoader into its constructor (required reordering of IsisSessionFactory#init to be able to do this)
  - thereby remove the whole SpecificationLookupDelegator contrivance
- JavaReflectorHelper
  - pass through deploymentType to ObjectReflectorDefault
- ObjectReflectorDefault
  - removal of isInjectorMethodFor, instead have callers instantiate the InjectorMethodEvaluatorDefault directly

also, to make caller hierarchy more useful::
- changed ApplicationScopedComponent and SessionScopedComponent into marker interfaces
- removed Injectable, pushed injectInto(Object) into subtypes

also:
- enhanced IsisMojoAbstract and IsisMojoValidate (maven-isis-plugin)
  - to accept an appManifest in the pom.xml
  - use an AppManifest rather than MetaModel to bootstrap the system and validate
- moved IsisComponentProviderDefault from core-integtest into core-runtime (renamed as ...Default2), so can be used by maven-isis-plugin

also:
- deleted AdapterManagerDefault, no longer used


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

Branch: refs/heads/ISIS-1194
Commit: a129fd2d5b3817d682aa128086d2cfa3a02854a3
Parents: 39771a1
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Sep 16 06:03:15 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Sep 16 06:03:15 2015 +0100

----------------------------------------------------------------------
 .../IsisComponentProviderDefault.java           | 223 +-------------
 .../isis/tool/mavenplugin/IsisMojoAbstract.java |  74 +++--
 .../isis/tool/mavenplugin/IsisMojoValidate.java |  19 +-
 .../tool/mavenplugin/MetaModelProcessor.java    |   7 +-
 .../AuthenticationSessionProvider.java          |   4 +-
 .../core/commons/components/Injectable.java     |  31 --
 .../core/commons/components/package-info.java   |   5 +-
 .../core/commons/config/IsisConfiguration.java  |   6 +-
 .../config/IsisConfigurationBuilder.java        |   5 +-
 ...IsisConfigurationBuilderResourceStreams.java |   1 -
 .../metamodel/adapter/mgr/AdapterManager.java   |   3 +-
 .../isis/core/metamodel/app/IsisMetaModel.java  | 186 +++---------
 .../deployment/DeploymentCategoryProvider.java  |   7 +-
 .../DeploymentCategoryProviderAbstract.java     |   1 -
 .../RemoveInjectMethodsFacetFactory.java        |   6 +-
 .../runtimecontext/ConfigurationService.java    |   7 +-
 .../runtimecontext/LocalizationProvider.java    |   5 +-
 .../runtimecontext/MessageBrokerService.java    |   4 +-
 .../PersistenceSessionService.java              |   4 +-
 .../runtimecontext/RuntimeContext.java          |   5 +-
 .../runtimecontext/RuntimeContextAbstract.java  | 112 +-------
 .../runtimecontext/ServicesInjector.java        |   6 +-
 .../noruntime/RuntimeContextNoRuntime.java      |  11 +-
 .../services/ServicesInjectorDefault.java       |  14 +-
 .../metamodel/services/ServicesInjectorSpi.java |   3 +-
 .../metamodel/spec/SpecificationLoader.java     |   4 +-
 .../spec/SpecificationLoaderAbstract.java       |   1 -
 .../spec/SpecificationLoaderDelegator.java      | 112 --------
 .../metamodel/spec/SpecificationLoaderSpi.java  |   3 +-
 .../specloader/ObjectReflectorDefault.java      |  57 ++--
 .../specloader/ObjectReflectorInstaller.java    |   5 +-
 .../transactions/TransactionStateProvider.java  |   5 +-
 .../progmodels/dflt/JavaReflectorHelper.java    |  10 +-
 .../JavaReflectorInstallerNoDecorators.java     |   7 +-
 ...IsisMetaModelBaseTest_constructDefaults.java |  26 +-
 ...IsisMetaModelTest_constructWithServices.java |   6 +-
 ...sMetaModelTest_getDomainObjectContainer.java |   2 +-
 .../metamodel/app/IsisMetaModelTest_init.java   | 171 -----------
 .../metamodel/facets/ProgrammableReflector.java |   8 -
 .../ObjectReflectorDefaultTestAbstract.java     |  35 +--
 .../testspec/ObjectSpecificationStub.java       |   3 +-
 .../installerregistry/InstallerLookup.java      |   8 +-
 .../PersistenceMechanismInstaller.java          |   4 +-
 .../persistence/adapter/PojoAdapter.java        |   2 +-
 .../adaptermanager/AdapterManagerDefault.java   | 136 ---------
 .../adaptermanager/OidAdapterHashMap.java       | 135 ---------
 .../adaptermanager/PojoAdapterHashMap.java      | 160 -----------
 .../RootAndCollectionAdapters.java              | 121 --------
 .../internal/RuntimeContextFromSession.java     |   7 +-
 .../core/runtime/runner/IsisInjectModule.java   |   6 +-
 .../isis/core/runtime/system/IsisSystem.java    |  75 +++--
 .../system/context/IsisContextThreadLocal.java  |  18 +-
 .../system/persistence/PersistenceSession.java  |  81 +++---
 .../persistence/PersistenceSessionFactory.java  | 128 +--------
 ...rsistenceSessionFactoryMetamodelRefiner.java |  53 ++++
 .../adaptermanager/OidAdapterHashMap.java       | 131 +++++++++
 .../adaptermanager/PojoAdapterHashMap.java      | 161 +++++++++++
 .../RootAndCollectionAdapters.java              | 121 ++++++++
 .../system/session/IsisSessionFactory.java      |  29 +-
 .../IsisComponentProvider.java                  |   8 +-
 .../IsisComponentProviderDefault2.java          | 287 +++++++++++++++++++
 .../IsisComponentProviderUsingInstallers.java   |  12 +-
 ...ataNucleusPersistenceMechanismInstaller.java |   6 +-
 .../core/runtime/context/IsisContextTest.java   |  11 +-
 .../persistence/PersistenceSessionTest.java     |  29 +-
 example/application/simpleapp/dom/pom.xml       |   3 +
 .../domainapp/dom/DomainAppDomManifest.java     |  92 ++++++
 67 files changed, 1265 insertions(+), 1763 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
index 1d3f5e6..1720160 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
@@ -19,52 +19,17 @@
 
 package org.apache.isis.core.integtestsupport;
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Set;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.fixtures.InstallableFixture;
-import org.apache.isis.applib.fixturescripts.FixtureScript;
 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.MetaModelRefiner;
-import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
-import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
-import org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson;
-import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
-import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
-import org.apache.isis.core.runtime.authentication.AuthenticationManager;
-import org.apache.isis.core.runtime.authentication.standard.AuthenticationManagerStandard;
-import org.apache.isis.core.runtime.authentication.standard.Authenticator;
-import org.apache.isis.core.runtime.authorization.AuthorizationManager;
-import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
-import org.apache.isis.core.runtime.fixtures.FixturesInstaller;
-import org.apache.isis.core.runtime.fixtures.FixturesInstallerFromConfiguration;
-import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession;
-import org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration;
-import org.apache.isis.core.runtime.services.ServicesInstallerFromConfigurationAndAnnotation;
 import org.apache.isis.core.runtime.system.DeploymentType;
-import org.apache.isis.core.runtime.system.IsisSystemException;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
-import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderAbstract;
-import org.apache.isis.core.runtime.transaction.facetdecorator.standard.StandardTransactionFacetDecorator;
-import org.apache.isis.core.security.authentication.AuthenticatorBypass;
-import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPersistenceMechanismInstaller;
-import org.apache.isis.progmodels.dflt.JavaReflectorHelper;
-import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
-
-public class IsisComponentProviderDefault extends IsisComponentProviderAbstract {
+import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
 
-    private final ProgrammingModel programmingModel;
-    private final MetaModelValidator metaModelValidator;
+public class IsisComponentProviderDefault extends IsisComponentProviderDefault2 {
 
     public IsisComponentProviderDefault(
             final DeploymentType deploymentType,
@@ -74,189 +39,7 @@ public class IsisComponentProviderDefault extends IsisComponentProviderAbstract
             final IsisConfiguration configurationOverride,
             final ProgrammingModel programmingModelOverride,
             final MetaModelValidator metaModelValidatorOverride) {
-        super(deploymentType, appManifestIfAny);
-
-        this.configuration = elseDefault(configurationOverride);
-
-        final String fixtureClassNamesCsv;
-        if(appManifest != null) {
-
-            putAppManifestKey(appManifest);
-            registerPackageNames(appManifest);
-            specifyServicesAndRegisteredEntitiesUsing(appManifest);
-
-            List<Class<? extends FixtureScript>> fixtureClasses = appManifest.getFixtures();
-            fixtureClassNamesCsv = classNamesFrom(fixtureClasses);
-
-            overrideConfigurationUsing(appManifest);
-
-            this.services = createServices(configuration);
-
-        } else {
-            fixtureClassNamesCsv = classNamesFrom(fixturesOverride);
-
-            this.services = elseDefault(servicesOverride, configuration);
-        }
-
-        putConfigurationProperty(FixturesInstallerFromConfiguration.FIXTURES, fixtureClassNamesCsv);
-        this.fixturesInstaller = createFixturesInstaller(configuration);
-
-        // integration tests ignore appManifest for authentication and authorization.
-        this.authenticationManager = createAuthenticationManager(configuration);
-        this.authorizationManager = createAuthorizationManager(configuration);
-
-        this.programmingModel = elseDefault(programmingModelOverride, configuration);
-        this.metaModelValidator = elseDefault(metaModelValidatorOverride);
-
-    }
-
-
-
-    //region > appManifest
-
-    private List<Object> createServices(final IsisConfiguration configuration) {
-        final ServicesInstallerFromConfigurationAndAnnotation servicesInstaller =
-                new ServicesInstallerFromConfigurationAndAnnotation();
-        servicesInstaller.setConfiguration(configuration);
-        return servicesInstaller.getServices();
-    }
-
-
-    @Override
-    protected void doPutConfigurationProperty(final String key, final String value) {
-        // bit hacky :-(
-        IsisConfigurationDefault configurationDefault = (IsisConfigurationDefault) this.configuration;
-        configurationDefault.put(key, value);
-    }
-
-    //endregion
-
-    /**
-     * Default will read <tt>isis.properties</tt> (and other optional property files) from the &quot;config&quot;
-     * package on the current classpath.
-     */
-    private static IsisConfigurationDefault elseDefault(final IsisConfiguration configuration) {
-        return configuration != null
-                ? (IsisConfigurationDefault) configuration
-                : new IsisConfigurationDefault(ResourceStreamSourceContextLoaderClassPath.create("config"));
-    }
-
-    private static List<Object> elseDefault(
-            final List<Object> servicesOverride,
-            final IsisConfiguration configuration) {
-        return servicesOverride != null
-                ? servicesOverride
-                : createDefaultServices(configuration);
-    }
-
-    private static List<Object> createDefaultServices(
-            final IsisConfiguration configuration) {
-        final ServicesInstallerFromConfiguration servicesInstaller = new ServicesInstallerFromConfiguration();
-        servicesInstaller.setConfiguration(configuration);
-        return servicesInstaller.getServices();
-    }
-
+        super(deploymentType, appManifestIfAny, servicesOverride, fixturesOverride, configurationOverride, programmingModelOverride, metaModelValidatorOverride);
 
-    private static ProgrammingModel elseDefault(final ProgrammingModel programmingModel, final IsisConfiguration configuration) {
-        return programmingModel != null
-                ? programmingModel
-                : createDefaultProgrammingModel(configuration);
     }
-
-    // TODO: this is duplicating logic in JavaReflectorInstallerNoDecorators; need to unify.
-    private static ProgrammingModel createDefaultProgrammingModel(final IsisConfiguration configuration) {
-        final ProgrammingModelFacetsJava5 programmingModel = new ProgrammingModelFacetsJava5();
-
-        ProgrammingModel.Util.includeFacetFactories(configuration, programmingModel);
-        ProgrammingModel.Util.excludeFacetFactories(configuration, programmingModel);
-        return programmingModel;
-    }
-
-    private static MetaModelValidator elseDefault(final MetaModelValidator metaModelValidator) {
-        return metaModelValidator != null
-                ? metaModelValidator
-                : new MetaModelValidatorDefault();
-    }
-
-    private static FixturesInstaller createFixturesInstaller(final IsisConfiguration configuration) {
-        final FixturesInstallerFromConfiguration fixturesInstallerFromConfiguration = new FixturesInstallerFromConfiguration();
-        fixturesInstallerFromConfiguration.setConfiguration(configuration);
-        return fixturesInstallerFromConfiguration;
-    }
-
-    /**
-     * The standard authentication manager, configured with the default authenticator (allows all requests through).
-     */
-    private static AuthenticationManager createAuthenticationManager(final IsisConfiguration configuration) {
-        final AuthenticationManagerStandard authenticationManager = new AuthenticationManagerStandard(configuration);
-        Authenticator authenticator = new AuthenticatorBypass(configuration);
-        authenticationManager.addAuthenticator(authenticator);
-        return authenticationManager;
-    }
-
-    /**
-     * The standard authorization manager, allowing all access.
-     */
-    private static AuthorizationManager createAuthorizationManager(final IsisConfiguration configuration) {
-        return new AuthorizationManagerStandard(configuration);
-    }
-
-
-    @Override
-    public DeploymentType getDeploymentType() {
-        return deploymentType;
-    }
-
-    @Override
-    public IsisConfigurationDefault getConfiguration() {
-        return configuration;
-    }
-
-    @Override
-    public List<Object> provideServices() {
-        return services;
-    }
-
-    @Override
-    public FixturesInstaller provideFixturesInstaller()  {
-        return fixturesInstaller;
-    }
-
-    @Override
-    public SpecificationLoaderSpi provideSpecificationLoaderSpi(
-            Collection<MetaModelRefiner> metaModelRefiners) throws IsisSystemException {
-
-        final Set<FacetDecorator> facetDecorators = Sets
-                .newHashSet((FacetDecorator) new StandardTransactionFacetDecorator(getConfiguration()));
-        final List<LayoutMetadataReader> layoutMetadataReaders =
-                Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson());
-
-        return JavaReflectorHelper
-                .createObjectReflector(
-                        programmingModel,
-                        metaModelRefiners,
-                        facetDecorators, layoutMetadataReaders,
-                        metaModelValidator,
-                        getConfiguration());
-    }
-
-    @Override
-    public AuthenticationManager provideAuthenticationManager(DeploymentType deploymentType) {
-        return authenticationManager;
-    }
-
-    @Override
-    public AuthorizationManager provideAuthorizationManager(DeploymentType deploymentType) {
-        return authorizationManager;
-    }
-
-    @Override
-    public PersistenceSessionFactory providePersistenceSessionFactory(
-            DeploymentType deploymentType,
-            final ServicesInjectorSpi servicesInjectorSpi,
-            final RuntimeContextFromSession runtimeContext) {
-        DataNucleusPersistenceMechanismInstaller installer = new DataNucleusPersistenceMechanismInstaller();
-        return installer.createPersistenceSessionFactory(deploymentType, servicesInjectorSpi, getConfiguration(), runtimeContext);
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
----------------------------------------------------------------------
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
index 0ce5991..10344a8 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoAbstract.java
@@ -31,14 +31,18 @@ import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault;
+import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.app.IsisMetaModel;
-import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
-import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
+import org.apache.isis.core.metamodel.specloader.ObjectReflectorDefault;
 import org.apache.isis.core.runtime.services.ServicesInstaller;
 import org.apache.isis.core.runtime.services.ServicesInstallerFromAnnotation;
 import org.apache.isis.core.runtime.services.ServicesInstallerFromConfigurationAndAnnotation;
+import org.apache.isis.core.runtime.system.DeploymentType;
+import org.apache.isis.core.runtime.system.IsisSystem;
+import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
 import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
 import org.apache.isis.tool.mavenplugin.util.IsisMetaModels;
 import org.apache.isis.tool.mavenplugin.util.MavenProjects;
@@ -53,6 +57,9 @@ public abstract class IsisMojoAbstract extends AbstractMojo {
     @Parameter(required = true, readonly = false, property = "isisConfigDir")
     private String isisConfigDir;
 
+    @Parameter(required = false, readonly = false, property = "appManifest")
+    private String appManifest;
+
     private final MetaModelProcessor metaModelProcessor;
     private final ContextForMojo context;
 
@@ -64,30 +71,49 @@ public abstract class IsisMojoAbstract extends AbstractMojo {
     public void execute() throws MojoExecutionException, MojoFailureException {
 
         final Plugin plugin = MavenProjects.lookupPlugin(mavenProject, CURRENT_PLUGIN_KEY);
-        final List<Object> serviceList = plugin != null ? serviceListFor(plugin) : null;
-        if(serviceList == null || serviceList.size() == 0) {
-            return;
-        }
-        getLog().info("Found " + serviceList.size() + " services");
 
-        usingIsisMetaModel(serviceList, metaModelProcessor);
-    }
+        if(this.appManifest != null) {
+
+            final AppManifest manifest = InstanceUtil.createInstance(this.appManifest, AppManifest.class);
+            final IsisComponentProviderDefault2 componentProvider = new IsisComponentProviderDefault2(
+                    DeploymentType.UNIT_TESTING, manifest, null, null, null, null, null);
+
+            final IsisSystem isisSystem = new IsisSystem(componentProvider);
+            try {
+                isisSystem.init();
+
+            } catch(RuntimeException ex) {
+                ;
+                // ignore
+            } finally {
+                isisSystem.shutdown();
+            }
+
+            final ObjectReflectorDefault specificationLoader =
+                    (ObjectReflectorDefault) isisSystem.getSessionFactory().getSpecificationLoader();
+            metaModelProcessor.process(specificationLoader, context);
+
 
-    private void usingIsisMetaModel(
-            final List<Object> serviceList,
-            final MetaModelProcessor metaModelProcessor) throws MojoExecutionException, MojoFailureException {
+        } else {
 
-        IsisMetaModel isisMetaModel = null;
-        try {
-            isisMetaModel = bootstrapIsis(serviceList);
-            metaModelProcessor.process(isisMetaModel, context);
-        } finally {
-            IsisMetaModels.disposeSafely(isisMetaModel);
+            final IsisConfiguration isisConfiguration = getIsisConfiguration();
+            final List<Object> serviceList = plugin != null ? serviceListFor(plugin, isisConfiguration) : null;
+            if (serviceList == null || serviceList.size() == 0) {
+                return;
+            }
+            getLog().info("Found " + serviceList.size() + " services");
+
+            IsisMetaModel isisMetaModel = null;
+            try {
+                isisMetaModel = bootstrapIsis(serviceList);
+                metaModelProcessor.process((ObjectReflectorDefault) isisMetaModel.getSpecificationLoader(), context);
+            } finally {
+                IsisMetaModels.disposeSafely(isisMetaModel);
+            }
         }
     }
 
-    private List<Object> serviceListFor(Plugin plugin) throws MojoFailureException {
-        IsisConfiguration isisConfiguration = getIsisConfiguration();
+    private List<Object> serviceListFor(Plugin plugin, final IsisConfiguration isisConfiguration) throws MojoFailureException {
 
         final ServicesInstaller servicesInstaller;
         if(isisConfiguration == null) {
@@ -126,13 +152,7 @@ public abstract class IsisMojoAbstract extends AbstractMojo {
     }
 
     private static IsisMetaModel bootstrapIsis(List<Object> serviceList) {
-        final RuntimeContextNoRuntime runtimeContext =
-                new RuntimeContextNoRuntime(
-                new ServicesInjectorDefault(serviceList));
-        IsisMetaModel isisMetaModel = new IsisMetaModel(
-                runtimeContext,
-                                            new ProgrammingModelFacetsJava5(),
-                                            serviceList);
+        IsisMetaModel isisMetaModel = new IsisMetaModel(new ProgrammingModelFacetsJava5(), serviceList);
         isisMetaModel.init();
         return isisMetaModel;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
----------------------------------------------------------------------
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
index e8bf8fa..2286ff1 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/IsisMojoValidate.java
@@ -19,13 +19,14 @@
 package org.apache.isis.tool.mavenplugin;
 
 import java.util.Collection;
-import org.apache.maven.plugin.MojoExecutionException;
+
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.isis.core.metamodel.app.IsisMetaModel;
+
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.ObjectReflectorDefault;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
 @Mojo(
@@ -42,14 +43,20 @@ public class IsisMojoValidate extends IsisMojoAbstract {
     }
 
     static class ValidateMetaModelProcessor implements MetaModelProcessor {
+
+
         @Override
-        public void process(final IsisMetaModel isisMetaModel, final Context context) throws MojoFailureException, MojoExecutionException {
-            final Collection<ObjectSpecification> objectSpecifications = isisMetaModel.getSpecificationLoader().allSpecifications();
+        public void process(
+                final ObjectReflectorDefault specificationLoader,
+                final Context context)
+                throws MojoFailureException {
+
+            final ValidationFailures validationFailures = specificationLoader.validate();
+
+            final Collection<ObjectSpecification> objectSpecifications = specificationLoader.allSpecifications();
             for (ObjectSpecification objectSpecification : objectSpecifications) {
                 context.getLog().debug("loaded: " + objectSpecification.getFullIdentifier());
             }
-
-            final ValidationFailures validationFailures = isisMetaModel.getValidationFailures();
             if (validationFailures.occurred()) {
                 context.throwFailureException(validationFailures.getNumberOfMessages() + " problems found.", validationFailures.getMessages());
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/MetaModelProcessor.java
----------------------------------------------------------------------
diff --git a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/MetaModelProcessor.java b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/MetaModelProcessor.java
index 2b2c688..bd6f457 100644
--- a/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/MetaModelProcessor.java
+++ b/core/maven-plugin/src/main/java/org/apache/isis/tool/mavenplugin/MetaModelProcessor.java
@@ -19,11 +19,13 @@
 package org.apache.isis.tool.mavenplugin;
 
 import java.util.Set;
+
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.project.MavenProject;
-import org.apache.isis.core.metamodel.app.IsisMetaModel;
+
+import org.apache.isis.core.metamodel.specloader.ObjectReflectorDefault;
 
 interface MetaModelProcessor {
 
@@ -42,5 +44,6 @@ interface MetaModelProcessor {
         void throwExecutionException(final String errorMessage, final Exception e) throws MojoExecutionException;
     }
 
-    public void process(final IsisMetaModel isisMetaModel, final Context context) throws MojoFailureException, MojoExecutionException;
+    void process(final ObjectReflectorDefault specificationLoader, final Context context) throws MojoFailureException;
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/AuthenticationSessionProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/AuthenticationSessionProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/AuthenticationSessionProvider.java
index d7cb01c..fa03a54 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/AuthenticationSessionProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/AuthenticationSessionProvider.java
@@ -16,9 +16,9 @@
  */
 package org.apache.isis.core.commons.authentication;
 
-import org.apache.isis.core.commons.components.Injectable;
+public interface AuthenticationSessionProvider {
 
-public interface AuthenticationSessionProvider extends Injectable {
+    void injectInto(final Object candidate);
 
     /**
      * Provided by <tt>AuthenticationManager</tt> when used by framework.

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Injectable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Injectable.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Injectable.java
deleted file mode 100644
index 5a91c2c..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/Injectable.java
+++ /dev/null
@@ -1,31 +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.commons.components;
-
-
-public interface Injectable {
-
-    /**
-     * Will inject itself into the candidate if the candidate implements the
-     * corresponding <tt>*Aware</tt> type.
-     */
-    void injectInto(Object candidate);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/commons/components/package-info.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/package-info.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/package-info.java
index 2edc81b..cafacb2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/components/package-info.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/components/package-info.java
@@ -33,9 +33,8 @@
  * </ul>
  * 
  * <p>
- * Many {@link org.apache.isis.core.commons.components.Component}s may also be
- * {@link org.apache.isis.core.commons.components.Injectable}, meaning that
- * they know hot to inject themselves to a candidate object &quot;if appropriate&quot;.
+ * Many {@link org.apache.isis.core.commons.components.Component}s may also be injectable,
+ * meaning that they know hot to inject themselves to a candidate object &quot;if appropriate&quot;.
  * The convention adopted in most cases is for an object requiring injection of
  * component <tt>Xxx</tt> to implement an <tt>XxxAware</tt> interface that
  * defines a <tt>setXxx(Xxx)</tt> method.

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
index bf03a12..d2bf8ab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfiguration.java
@@ -24,7 +24,7 @@ import java.awt.Font;
 import java.util.Iterator;
 import java.util.Map;
 
-import org.apache.isis.core.commons.components.Injectable;
+import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
 
@@ -42,7 +42,9 @@ import org.apache.isis.core.commons.resource.ResourceStreamSource;
  * Thus the {@link IsisConfiguration} held by different components may vary, but
  * with each being a possible superset of the previous.
  */
-public interface IsisConfiguration extends DebuggableWithTitle, Injectable, Iterable<String> {
+public interface IsisConfiguration extends DebuggableWithTitle, Iterable<String>, ApplicationScopedComponent {
+
+    void injectInto(Object candidate);
 
     /**
      * Creates a new IsisConfiguration containing the properties starting with

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
index a196b06..c118c87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilder.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.commons.config;
 
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.commons.resource.ResourceStreamSource;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsibility;
 
@@ -33,7 +32,9 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsi
  * @see IsisConfiguration for more details on the mutable/immutable pair
  *      pattern.
  */
-public interface IsisConfigurationBuilder extends Injectable {
+public interface IsisConfigurationBuilder {
+
+    void injectInto(Object candidate);
 
     /**
      * Returns a currently known {@link IsisConfiguration}.

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
index 994fcf6..48c282e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationBuilderResourceStreams.java
@@ -243,7 +243,6 @@ public class IsisConfigurationBuilderResourceStreams implements IsisConfiguratio
     // Injectable
     // ////////////////////////////////////////////////////////////
 
-    @Override
     public void injectInto(final Object candidate) {
         if (IsisConfigurationBuilderAware.class.isAssignableFrom(candidate.getClass())) {
             final IsisConfigurationBuilderAware cast = IsisConfigurationBuilderAware.class.cast(candidate);

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
index 899a656..4a66f50 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
@@ -22,12 +22,11 @@ package org.apache.isis.core.metamodel.adapter.mgr;
 import java.util.concurrent.Callable;
 
 import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
-public interface AdapterManager extends Injectable {
+public interface AdapterManager {
 
     /**
      * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/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 e2bcb82..476b356 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
@@ -20,33 +20,31 @@
 package org.apache.isis.core.metamodel.app;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+
 import com.google.common.collect.Lists;
+
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
 import org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
 import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
-import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 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.validator.MetaModelValidator;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
 import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
 
 /**
  * Facade for the entire Isis metamodel and supporting components.
@@ -57,51 +55,65 @@ import static org.hamcrest.CoreMatchers.notNullValue;
  */
 public class IsisMetaModel implements ApplicationScopedComponent {
 
+
     private static enum State {
         NOT_INITIALIZED, INITIALIZED, SHUTDOWN;
     }
 
-    private final List<Object> services = Lists.newArrayList();
-
     private State state = State.NOT_INITIALIZED;
 
-    private ObjectReflectorDefault reflector;
+    private final ServicesInjectorSpi servicesInjector;
+
+    private ObjectReflectorDefault specificationLoader;
     private RuntimeContext runtimeContext;
 
-    private IsisConfiguration configuration;
+    private IsisConfigurationDefault configuration;
     private ProgrammingModel programmingModel;
     private Set<FacetDecorator> facetDecorators;
     private MetaModelValidatorComposite metaModelValidator;
 
     private ValidationFailures validationFailures;
 
-    public IsisMetaModel(final RuntimeContext runtimeContext, ProgrammingModel programmingModel, final List<Object> services) {
-        this(runtimeContext, programmingModel, services.toArray());
+    public IsisMetaModel(
+            final ProgrammingModel programmingModel,
+            final List<Object> services) {
+        this(programmingModel, services.toArray());
     }
     
     public IsisMetaModel(
-            final RuntimeContext runtimeContext,
             final ProgrammingModel programmingModel,
             final Object... services) {
-        this.runtimeContext = runtimeContext;
 
-        this.services.add(new DomainObjectContainerDefault());
-        this.services.addAll(Arrays.asList(services));
+        this.programmingModel = programmingModel;
+
+        final List<Object> serviceList = Lists.newArrayList();
+        serviceList.addAll(Arrays.asList(services));
+        this.servicesInjector = new ServicesInjectorDefault(serviceList);
 
         this.configuration = new IsisConfigurationDefault();
 
         this.facetDecorators = new TreeSet<>();
-        setProgrammingModelFacets(programmingModel);
 
         this.metaModelValidator = new MetaModelValidatorComposite();
-        programmingModel.refineMetaModelValidator(metaModelValidator, configuration);
+        this.programmingModel.refineMetaModelValidator(metaModelValidator, configuration);
+
+        final DeploymentCategory deploymentCategory = DeploymentCategory.PRODUCTION;
+        final List<LayoutMetadataReader> layoutMetadataReaders =
+                Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson());
+
+        this.specificationLoader = new ObjectReflectorDefault(
+                deploymentCategory, configuration,
+                this.programmingModel, facetDecorators,
+                metaModelValidator, layoutMetadataReaders);
+        specificationLoader.setServiceInjector(servicesInjector);
+
+        this.runtimeContext = new RuntimeContextNoRuntime(
+                deploymentCategory, configuration, servicesInjector, specificationLoader);
+
     }
 
-    /**
-     * The list of classes representing services.
-     */
-    public List<Object> getServices() {
-        return Collections.unmodifiableList(services);
+    public ServicesInjectorSpi getServicesInjector() {
+        return servicesInjector;
     }
 
     // ///////////////////////////////////////////////////////
@@ -111,27 +123,17 @@ public class IsisMetaModel implements ApplicationScopedComponent {
     public void init() {
         ensureNotInitialized();
 
-        final List<LayoutMetadataReader> layoutMetadataReaders = Lists.<LayoutMetadataReader>newArrayList(
-                new LayoutMetadataReaderFromJson());
+        runtimeContext.injectInto(specificationLoader);
 
-        reflector = new ObjectReflectorDefault(configuration, programmingModel, facetDecorators, metaModelValidator, layoutMetadataReaders);
+        specificationLoader.initialize();
 
-        final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault(services);
-        reflector.setServiceInjector(servicesInjector);
-        
-        runtimeContext.injectInto(reflector);
-        reflector.injectInto(runtimeContext);
-
-        reflector.initialize();
-
-        validationFailures = reflector.validate();
-        runtimeContext.init();
-
-        for (final Object service : services) {
-            final ObjectSpecification serviceSpec = reflector.loadSpecification(service.getClass());
+        for (final Object service : servicesInjector.getRegisteredServices()) {
+            final ObjectSpecification serviceSpec = specificationLoader.loadSpecification(service.getClass());
             serviceSpec.markAsService();
         }
 
+        validationFailures = specificationLoader.validate();
+
         state = State.INITIALIZED;
     }
     
@@ -144,113 +146,15 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         state = State.SHUTDOWN;
     }
 
-    // ///////////////////////////////////////////////////////
-    // SpecificationLoader
-    // ///////////////////////////////////////////////////////
 
     /**
      * Available once {@link #init() initialized}.
      */
     public SpecificationLoaderSpi getSpecificationLoader() {
-        return reflector;
-    }
-
-
-    // ///////////////////////////////////////////////////////
-    // DependencyInjector
-    // ///////////////////////////////////////////////////////
-
-    /**
-     * Available once {@link #init() initialized}.
-     */
-    public ServicesInjector getDependencyInjector() {
-        ensureInitialized();
-        return runtimeContext.getServicesInjector();
+        return specificationLoader;
     }
 
-    // ///////////////////////////////////////////////////////
-    // Override defaults
-    // ///////////////////////////////////////////////////////
-
-    /**
-     * The {@link IsisConfiguration} in force, either defaulted or specified
-     * {@link #setConfiguration(IsisConfiguration) explicitly.}
-     */
-    public IsisConfiguration getConfiguration() {
-        return configuration;
-    }
-
-    /**
-     * Optionally specify the {@link IsisConfiguration}.
-     * 
-     * <p>
-     * Call prior to {@link #init()}.
-     */
-    public void setConfiguration(final IsisConfiguration configuration) {
-        ensureNotInitialized();
-        ensureThatArg(configuration, is(notNullValue()));
-        this.configuration = configuration;
-    }
-
-    /**
-     * The {@link ProgrammingModel} in force, either defaulted or specified
-     * {@link #setProgrammingModelFacets(ProgrammingModel) explicitly}.
-     */
-    public ProgrammingModel getProgrammingModelFacets() {
-        return programmingModel;
-    }
-
-    /**
-     * Optionally specify the {@link ProgrammingModel}.
-     * 
-     * <p>
-     * Call prior to {@link #init()}.
-     */
-    public void setProgrammingModelFacets(final ProgrammingModel programmingModel) {
-        ensureNotInitialized();
-        ensureThatArg(programmingModel, is(notNullValue()));
-        this.programmingModel = programmingModel;
-    }
-
-    /**
-     * The {@link FacetDecorator}s in force, either defaulted or specified
-     * {@link #setFacetDecorators(Set) explicitly}.
-     */
-    public Set<FacetDecorator> getFacetDecorators() {
-        return Collections.unmodifiableSet(facetDecorators);
-    }
-
-    /**
-     * Optionally specify the {@link FacetDecorator}s.
-     * 
-     * <p>
-     * Call prior to {@link #init()}.
-     */
-    public void setFacetDecorators(final Set<FacetDecorator> facetDecorators) {
-        ensureNotInitialized();
-        ensureThatArg(facetDecorators, is(notNullValue()));
-        this.facetDecorators = facetDecorators;
-    }
-
-    /**
-     * The {@link MetaModelValidator} in force, either defaulted or specified
-     * {@link #setMetaModelValidator(org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite) explicitly}.
-     */
-    public MetaModelValidatorComposite getMetaModelValidator() {
-        return metaModelValidator;
-    }
-
-    /**
-     * Optionally specify the {@link MetaModelValidator}.
-     * @param metaModelValidator
-     */
-    public void setMetaModelValidator(final MetaModelValidatorComposite metaModelValidator) {
-        this.metaModelValidator = metaModelValidator;
-    }
-
-    // ///////////////////////////////////////////////////////
-    // State management
-    // ///////////////////////////////////////////////////////
+    //region > State management
 
     private State ensureNotInitialized() {
         return ensureThatState(state, is(State.NOT_INITIALIZED));
@@ -260,4 +164,6 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         return ensureThatState(state, is(State.INITIALIZED));
     }
 
+    //endregion
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProvider.java
index f162be4..8949bd0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProvider.java
@@ -19,8 +19,9 @@
 
 package org.apache.isis.core.metamodel.deployment;
 
-import org.apache.isis.core.commons.components.Injectable;
+public interface DeploymentCategoryProvider {
 
-public interface DeploymentCategoryProvider extends Injectable {
-    public DeploymentCategory getDeploymentCategory();
+    void injectInto(final Object candidate);
+
+    DeploymentCategory getDeploymentCategory();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProviderAbstract.java
index 635ece8..1ca1904 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/deployment/DeploymentCategoryProviderAbstract.java
@@ -18,7 +18,6 @@ package org.apache.isis.core.metamodel.deployment;
 
 public abstract class DeploymentCategoryProviderAbstract implements DeploymentCategoryProvider {
 
-    @Override
     public void injectInto(final Object candidate) {
         if (DeploymentCategoryAware.class.isAssignableFrom(candidate.getClass())) {
             final DeploymentCategoryAware cast = DeploymentCategoryAware.class.cast(candidate);

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
index 69df125..8113493 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
@@ -23,9 +23,13 @@ import java.lang.reflect.Method;
 import java.util.List;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
+import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
 
 public class RemoveInjectMethodsFacetFactory extends FacetFactoryAbstract  {
 
+    private final InjectorMethodEvaluator injectorMethodEvaluator = new InjectorMethodEvaluatorDefault();
+
     public RemoveInjectMethodsFacetFactory() {
         super(FeatureType.OBJECTS_ONLY);
     }
@@ -36,7 +40,7 @@ public class RemoveInjectMethodsFacetFactory extends FacetFactoryAbstract  {
         for (Class<? extends Object> serviceClass : serviceClasses) {
             Method[] methods = processClassContext.getCls().getMethods();
             for (Method method : methods) {
-                if(getSpecificationLoader().isInjectorMethodFor(method, serviceClass)) {
+                if(injectorMethodEvaluator.isInjectorMethodFor(method, serviceClass)) {
                     processClassContext.removeMethod(method);
                 }
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ConfigurationService.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ConfigurationService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ConfigurationService.java
index ea6e191..1fa57b1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ConfigurationService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ConfigurationService.java
@@ -18,14 +18,11 @@ package org.apache.isis.core.metamodel.runtimecontext;
 
 import java.util.List;
 
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 
-public interface ConfigurationService extends Injectable {
+public interface ConfigurationService {
 
-    // //////////////////////////////////////////////////////////////////
-    // properties
-    // //////////////////////////////////////////////////////////////////
+    void injectInto(final Object candidate);
 
     /**
      * Provided by {@link RuntimeContextAbstract} itself, cloned properties from

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/LocalizationProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/LocalizationProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/LocalizationProvider.java
index a59b2af..040a90a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/LocalizationProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/LocalizationProvider.java
@@ -20,9 +20,10 @@
 package org.apache.isis.core.metamodel.runtimecontext;
 
 import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.commons.components.Injectable;
 
-public interface LocalizationProvider extends Injectable {
+public interface LocalizationProvider {
+
+    void injectInto(final Object candidate);
 
     Localization getLocalization();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/MessageBrokerService.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/MessageBrokerService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/MessageBrokerService.java
index 0f20b95..d33e327 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/MessageBrokerService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/MessageBrokerService.java
@@ -16,9 +16,9 @@
  */
 package org.apache.isis.core.metamodel.runtimecontext;
 
-import org.apache.isis.core.commons.components.Injectable;
+public interface MessageBrokerService {
 
-public interface MessageBrokerService extends Injectable {
+    void injectInto(final Object candidate);
 
     /**
      * Provided by <tt>MessageBroker</tt> when used by framework.

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/PersistenceSessionService.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/PersistenceSessionService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/PersistenceSessionService.java
index 0dc688e..ec5eede 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/PersistenceSessionService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/PersistenceSessionService.java
@@ -20,13 +20,13 @@ import java.util.List;
 
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
-public interface PersistenceSessionService extends AdapterManager, Injectable {
+public interface PersistenceSessionService extends AdapterManager {
 
+    void injectInto(final Object candidate);
 
     // ///////////////////////////////////////////
     // Instantiate

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContext.java
index 4ba0225..3b0d604 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContext.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.runtimecontext;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.transactions.TransactionStateProvider;
@@ -31,9 +30,9 @@ import org.apache.isis.core.metamodel.transactions.TransactionStateProvider;
  * Decouples the metamodel from a runtime.
  * 
  */
-public interface RuntimeContext extends Injectable, ApplicationScopedComponent {
+public interface RuntimeContext extends ApplicationScopedComponent {
 
-    public void init();
+    void injectInto(Object candidate);
 
     // //////////////////////////////////////
     // application-scoped

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
index ddd75c3..e647090 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
@@ -19,42 +19,35 @@
 
 package org.apache.isis.core.metamodel.runtimecontext;
 
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.List;
-
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProviderAbstract;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderDelegator;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpiAware;
-
-public abstract class RuntimeContextAbstract implements RuntimeContext, SpecificationLoaderSpiAware {
 
-    private final SpecificationLoaderDelegator specificationLookupDelegator = new SpecificationLoaderDelegator();
+public abstract class RuntimeContextAbstract implements RuntimeContext {
 
     private final DeploymentCategory deploymentCategory;
     private final IsisConfigurationDefault configuration;
     private final ServicesInjector servicesInjector;
+    private final SpecificationLoaderSpi specificationLoader;
 
     public RuntimeContextAbstract(
             final DeploymentCategory deploymentCategory,
             final IsisConfigurationDefault configuration,
-            final ServicesInjector servicesInjector) {
+            final ServicesInjector servicesInjector,
+            final SpecificationLoaderSpi specificationLoader) {
         this.deploymentCategory = deploymentCategory;
         this.configuration = configuration;
         this.servicesInjector = servicesInjector;
+        this.specificationLoader = specificationLoader;
     }
 
 
     @Override
     public DeploymentCategoryProvider getDeploymentCategoryProvider() {
         return new DeploymentCategoryProviderAbstract() {
+
             @Override
             public DeploymentCategory getDeploymentCategory() {
                 return deploymentCategory;
@@ -73,14 +66,13 @@ public abstract class RuntimeContextAbstract implements RuntimeContext, Specific
         return servicesInjector;
     }
 
-    public void init() {
-    }
-
-    public void shutdown() {
+    @Override
+    public SpecificationLoaderSpi getSpecificationLoader() {
+        return specificationLoader;
     }
 
 
-    @Override
+    //@Override
     public void injectInto(final Object candidate) {
         if (RuntimeContextAware.class.isAssignableFrom(candidate.getClass())) {
             final RuntimeContextAware cast = RuntimeContextAware.class.cast(candidate);
@@ -101,88 +93,4 @@ public abstract class RuntimeContextAbstract implements RuntimeContext, Specific
         getSpecificationLoader().injectInto(candidate);
     }
 
-    @Override
-    public SpecificationLoader getSpecificationLoader() {
-        return specificationLookupDelegator;
-    }
-
-    /**
-     * Is injected into when the reflector is initialized.
-     */
-    @Override
-    public void setSpecificationLoaderSpi(final SpecificationLoaderSpi specificationLoader) {
-        this.specificationLookupDelegator.setDelegate(new SpecificationLoader() {
-
-            @Override
-            public void injectInto(final Object candidate) {
-                specificationLoader.injectInto(candidate);
-            }
-
-            @Override
-            public ObjectSpecification loadSpecification(final Class<?> cls) {
-                return specificationLoader.loadSpecification(cls);
-            }
-
-            @Override
-            public Collection<ObjectSpecification> allSpecifications() {
-                return specificationLoader.allSpecifications();
-            }
-
-            @Override
-            public ObjectSpecification lookupBySpecId(ObjectSpecId objectSpecId) {
-                return specificationLoader.lookupBySpecId(objectSpecId);
-            }
-
-            @Override
-            public ObjectSpecification loadSpecification(String fullyQualifiedClassName) {
-                return specificationLoader.loadSpecification(fullyQualifiedClassName);
-            }
-
-            @Override
-            public boolean loadSpecifications(List<Class<?>> typesToLoad) {
-                return specificationLoader.loadSpecifications(typesToLoad);
-            }
-
-            @Override
-            public boolean loadSpecifications(List<Class<?>> typesToLoad, Class<?> typeToIgnore) {
-                return specificationLoader.loadSpecifications(typesToLoad, typeToIgnore);
-            }
-
-            @Override
-            public boolean loaded(Class<?> cls) {
-                return specificationLoader.loaded(cls);
-            }
-
-            @Override
-            public boolean loaded(String fullyQualifiedClassName) {
-                return specificationLoader.loaded(fullyQualifiedClassName);
-            }
-
-            @Override
-            public ObjectSpecification introspectIfRequired(ObjectSpecification spec) {
-                return specificationLoader.introspectIfRequired(spec);
-            }
-
-            @Override
-            public List<Class<?>> getServiceClasses() {
-                return specificationLoader.getServiceClasses();
-            }
-
-            @Override
-            public boolean isServiceClass(Class<?> cls) {
-                return specificationLoader.isServiceClass(cls);
-            }
-
-            @Override
-            public void invalidateCache(Class<?> domainClass) {
-                specificationLoader.invalidateCache(domainClass);
-            }
-
-            @Override
-            public boolean isInjectorMethodFor(Method method, Class<? extends Object> serviceClass) {
-                return specificationLoader.isInjectorMethodFor(method, serviceClass);
-            }
-        });
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
index 0676c19..5a2439d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
@@ -17,12 +17,14 @@
 package org.apache.isis.core.metamodel.runtimecontext;
 
 import java.util.List;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.publish.PublishingService;
-import org.apache.isis.core.commons.components.Injectable;
 
-public interface ServicesInjector extends Injectable {
+public interface ServicesInjector {
+
+    void injectInto(final Object candidate);
 
     /**
      * All registered services, as an immutable {@link List}.

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
index b2a2dcf..355c418 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
@@ -42,6 +42,7 @@ import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionServiceAb
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContextAbstract;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.transactions.TransactionState;
 import org.apache.isis.core.metamodel.transactions.TransactionStateProvider;
@@ -55,15 +56,17 @@ public class RuntimeContextNoRuntime extends RuntimeContextAbstract {
     private final MessageBrokerServiceAbstract messageBrokerService;
 
     public RuntimeContextNoRuntime(
-            final ServicesInjector servicesInjector) {
-        this(DeploymentCategory.PRODUCTION, new IsisConfigurationDefault(null), servicesInjector);
+            final ServicesInjector servicesInjector,
+            final SpecificationLoaderSpi specificationLoader) {
+        this(DeploymentCategory.PRODUCTION, new IsisConfigurationDefault(null), servicesInjector, specificationLoader);
     }
 
     public RuntimeContextNoRuntime(
             final DeploymentCategory deploymentCategory,
             final IsisConfigurationDefault isisConfiguration,
-            final ServicesInjector servicesInjector) {
-        super(deploymentCategory, isisConfiguration, servicesInjector);
+            final ServicesInjector servicesInjector,
+            final SpecificationLoaderSpi specificationLoader) {
+        super(deploymentCategory, isisConfiguration, servicesInjector, specificationLoader);
         authenticationSessionProvider = new AuthenticationSessionProviderAbstract() {
             @Override
             public AuthenticationSession getAuthenticationSession() {

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
index 714ad1b..8761a9b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
@@ -56,7 +56,7 @@ import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
 /**
  * Must be a thread-safe.
  */
-public class ServicesInjectorDefault implements ServicesInjectorSpi, SpecificationLoaderAware {
+public class ServicesInjectorDefault implements ServicesInjectorSpi {
 
     private static final Logger LOG = LoggerFactory.getLogger(ServicesInjectorDefault.class);
 
@@ -73,6 +73,8 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
 
     private final Map<Class<?>, Object> serviceByConcreteType = Maps.newHashMap();
 
+    private final InjectorMethodEvaluator injectorMethodEvaluator;
+
     public ServicesInjectorDefault(final List<Object> services) {
         this(services, null);
     }
@@ -452,14 +454,4 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
 
     //endregion
 
-    //region > injected dependencies
-
-    private InjectorMethodEvaluator injectorMethodEvaluator;
-
-    @Override
-    public void setSpecificationLoader(final SpecificationLoader specificationLookup) {
-        injectorMethodEvaluator = specificationLookup;
-    }
-
-    //endregion
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
index bf5418a..9bf8d01 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.services;
 
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 
 /**
@@ -29,7 +28,7 @@ import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
  * <p>
  * Can be considered a mutable SPI to the {@link org.apache.isis.core.metamodel.runtimecontext.ServicesInjector} immutable API.
  */
-public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injectable, ServicesInjector {
+public interface ServicesInjectorSpi extends ApplicationScopedComponent, ServicesInjector {
 
     public void init();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
index 9bfe890..271a389 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
@@ -18,11 +18,11 @@ package org.apache.isis.core.metamodel.spec;
 
 import java.util.Collection;
 import java.util.List;
-import org.apache.isis.core.commons.components.Injectable;
+
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 
-public interface SpecificationLoader extends Injectable, InjectorMethodEvaluator {
+public interface SpecificationLoader {
 
     ObjectSpecification lookupBySpecId(ObjectSpecId objectSpecId);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAbstract.java
index f45cfaf..5447e12 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAbstract.java
@@ -18,7 +18,6 @@ package org.apache.isis.core.metamodel.spec;
 
 public abstract class SpecificationLoaderAbstract implements SpecificationLoader {
 
-    @Override
     public void injectInto(final Object candidate) {
         if (SpecificationLoaderAware.class.isAssignableFrom(candidate.getClass())) {
             final SpecificationLoaderAware cast = SpecificationLoaderAware.class.cast(candidate);

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
deleted file mode 100644
index 7dec35b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
+++ /dev/null
@@ -1,112 +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.spec;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Allows a {@link SpecificationLoader} to be provided even if the concrete
- * implementation is only available later.
- */
-public class SpecificationLoaderDelegator extends SpecificationLoaderAbstract {
-
-    private SpecificationLoader specificationLoaderDelegate;
-
-    public void setDelegate(final SpecificationLoader specificationLoaderDelegate) {
-        this.specificationLoaderDelegate = specificationLoaderDelegate;
-    }
-
-    @Override
-    public ObjectSpecification loadSpecification(final Class<?> cls) {
-        if (specificationLoaderDelegate == null) {
-            throw new IllegalStateException("No SpecificationLookup provided");
-        }
-        return specificationLoaderDelegate.loadSpecification(cls);
-    }
-
-    @Override
-    public Collection<ObjectSpecification> allSpecifications() {
-        return specificationLoaderDelegate.allSpecifications();
-    }
-
-    @Override
-    public ObjectSpecification lookupBySpecId(ObjectSpecId objectSpecId) {
-        return specificationLoaderDelegate.lookupBySpecId(objectSpecId);
-    }
-
-    @Override
-    public boolean loadSpecifications(List<Class<?>> typesToLoad, Class<?> typeToIgnore) {
-        return specificationLoaderDelegate.loadSpecifications(typesToLoad, typeToIgnore);
-    }
-
-    @Override
-    public ObjectSpecification loadSpecification(String fullyQualifiedClassName) {
-        return specificationLoaderDelegate.loadSpecification(fullyQualifiedClassName);
-    }
-
-    @Override
-    public boolean loaded(Class<?> cls) {
-        return specificationLoaderDelegate.loaded(cls);
-    }
-
-    @Override
-    public boolean loaded(String fullyQualifiedClassName) {
-        return specificationLoaderDelegate.loaded(fullyQualifiedClassName);
-    }
-
-    @Override
-    public boolean loadSpecifications(List<Class<?>> typesToLoad) {
-        return specificationLoaderDelegate.loadSpecifications(typesToLoad);
-    }
-
-    @Override
-    public ObjectSpecification introspectIfRequired(ObjectSpecification spec) {
-        return specificationLoaderDelegate.introspectIfRequired(spec);
-    }
-
-    @Override
-    public List<Class<?>> getServiceClasses() {
-        return specificationLoaderDelegate.getServiceClasses();
-    }
-    @Override
-    public boolean isServiceClass(Class<?> cls) {
-        return specificationLoaderDelegate.isServiceClass(cls);
-    }
-
-    @Override
-    public void invalidateCache(Class<?> domainClass) {
-        specificationLoaderDelegate.invalidateCache(domainClass);
-    }
-
-    @Override
-    public boolean isInjectorMethodFor(Method method, Class<? extends Object> serviceClass) {
-        return specificationLoaderDelegate.isInjectorMethodFor(method, serviceClass);
-    }
-
-    @Override
-    public void injectInto(Object candidate) {
-        super.injectInto(candidate);
-        if(specificationLoaderDelegate != null) {
-            specificationLoaderDelegate.injectInto(candidate);
-        }
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
index 600904e..130ced2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
@@ -25,12 +25,13 @@ import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 
 public interface SpecificationLoaderSpi extends ApplicationScopedComponent, DebuggableWithTitle, SpecificationLoader {
 
+    void injectInto(final Object candidate);
+
     public void init();
     public void shutdown();
 
     /**
      * Specify the services to pro-actively prime the cache, and to initialize them also.
-     * @param services
      */
     void setServiceInjector(ServicesInjectorSpi services);