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 2016/05/20 07:04:29 UTC

[08/31] isis git commit: ISIS-1407: SpecificationLoader is now a concrete class (rolled ObjectReflector up into it).

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
index fface56..0d9aa6d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
@@ -30,7 +30,7 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacetAbstract;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
index 22bfeaa..dcbf114 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethod.java
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacetAbstract;
 
 public class PropertyDefaultFacetViaMethod extends PropertyDefaultFacetAbstract implements ImperativeFacet {

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
index 1a0494a..9c5c651 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
@@ -37,7 +37,7 @@ import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class PropertyDomainEventFacetAbstract
         extends SingleClassValueFacetAbstract implements PropertyDomainEventFacet {

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java
index 1dcc524..7e9c0d4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class PropertyDomainEventFacetDefault extends PropertyDomainEventFacetAbstract {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
index 3b90bb7..2a70364 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * @deprecated

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java
index 381616e..2515cda 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class PropertyDomainEventFacetForPropertyAnnotation extends PropertyDomainEventFacetAbstract {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyInteractionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyInteractionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyInteractionAnnotation.java
index c0cbbb2..3afdb20 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyInteractionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyInteractionAnnotation.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * @deprecated

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/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 d7ab75b..f1a7ae4 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
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.runtimecontext;
 
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.transactions.TransactionStateProvider;
 
 /**

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/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 00074a3..d33c189 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,7 +19,7 @@
 
 package org.apache.isis.core.metamodel.runtimecontext;
 
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class RuntimeContextAbstract implements RuntimeContext {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/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 c673643..4639058 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
@@ -39,7 +39,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.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index f801f83..fd8f0c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -53,8 +53,8 @@ import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySe
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
index 6868e22..aee46d9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
@@ -64,8 +64,8 @@ import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionServiceAw
 import org.apache.isis.core.metamodel.services.container.query.QueryFindByPattern;
 import org.apache.isis.core.metamodel.services.container.query.QueryFindByTitle;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 
 @DomainService(nature = NatureOfService.DOMAIN)
 public class DomainObjectContainerDefault

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/factory/FactoryServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/factory/FactoryServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/factory/FactoryServiceDefault.java
index 233bacc..ebdda4f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/factory/FactoryServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/factory/FactoryServiceDefault.java
@@ -35,8 +35,8 @@ import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
 import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionServiceAware;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 
 @DomainService(
         nature = NatureOfService.DOMAIN

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 0c32add..7904ea9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -104,8 +104,8 @@ import org.apache.isis.core.metamodel.facets.properties.propertylayout.NamedFace
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.RenderedAdjustedFacetForPropertyXml;
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.TypicalLengthFacetForPropertyXml;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
index 5135f62..89dd2c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
@@ -45,8 +45,8 @@ import org.apache.isis.applib.services.layout.LayoutService;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 
 @DomainService(

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index c433e45..060fd07 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -40,8 +40,8 @@ import org.apache.isis.applib.services.metamodel.MetaModelService2;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 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.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
index aa41824..15dc64b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
@@ -30,8 +30,8 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.core.metamodel.services.swagger.internal.SwaggerSpecGenerator;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderAware;
 
 @DomainService(
         nature = NatureOfService.DOMAIN

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
index d1704c4..d76dfb9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
@@ -45,7 +45,7 @@ import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/SwaggerSpecGenerator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
index 25cb917..928996e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.services.swagger.internal;
 import com.fasterxml.jackson.core.JsonProcessingException;
 
 import org.apache.isis.applib.services.swagger.SwaggerService;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 import io.swagger.models.Swagger;
 import io.swagger.util.Json;

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index ffe719a..7ad59bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -51,6 +51,7 @@ import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionContainer;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationContainer;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 
 /**

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecificationDependencies.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecificationDependencies.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecificationDependencies.java
index f8def88..40275f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecificationDependencies.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecificationDependencies.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.spec;
 
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 
 public class ObjectSpecificationDependencies {

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/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
deleted file mode 100644
index bacbd39..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
+++ /dev/null
@@ -1,101 +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.util.Collection;
-import java.util.List;
-
-import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
-import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
-
-public interface SpecificationLoader extends ApplicationScopedComponent {
-
-    ObjectSpecification lookupBySpecId(ObjectSpecId objectSpecId);
-
-    /**
-     * Return the specification for the specified class of object.
-     * 
-     * <p>
-     * It is possible for this method to return <tt>null</tt>, for example if
-     * the configured {@link org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor}
-     * has filtered out the class.
-     */
-    ObjectSpecification loadSpecification(String fullyQualifiedClassName);
-
-    /**
-     * @see #loadSpecification(String)
-     */
-    ObjectSpecification loadSpecification(Class<?> cls);
-
-    /**
-     * Loads the specifications of the specified types.
-     */
-    boolean loadSpecifications(List<Class<?>> typesToLoad);
-
-    /**
-     * Loads the specifications of the specified types except the one specified
-     * (to prevent an infinite loop).
-     */
-    boolean loadSpecifications(List<Class<?>> typesToLoad, final Class<?> typeToIgnore);
-
-
-    /**
-     * Typically does not need to be called, but is available for {@link FacetFactory}s to force
-     * early introspection of referenced specs in certain circumstances.
-     * 
-     * <p>
-     * Originally introduced to support {@link AutoCompleteFacet}.
-     */
-    ObjectSpecification introspectIfRequired(final ObjectSpecification spec);
-    
-    
-    Collection<ObjectSpecification> allSpecifications();
-
-
-    List<Class<?>> getServiceClasses();
-
-    boolean isServiceClass(Class<?> cls);
-
-    /**
-     * Whether this class has been loaded.
-     */
-    boolean loaded(Class<?> cls);
-
-    /**
-     * @see #loaded(Class).
-     */
-    boolean loaded(String fullyQualifiedClassName);
-
-
-    void invalidateCache(Class<?> domainClass);
-
-
-
-
-    void injectInto(final Object candidate);
-
-    void init(final RuntimeContext runtimeContext);
-    void shutdown();
-
-    boolean isInitialized();
-
-    void validateAndAssert();
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAware.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAware.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAware.java
deleted file mode 100644
index 3504a84..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderAware.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.metamodel.spec;
-
-import org.apache.isis.applib.annotation.Programmatic;
-
-public interface SpecificationLoaderAware {
-
-    @Programmatic
-    public void setSpecificationLoader(final SpecificationLoader specificationLookup);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberDependencies.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberDependencies.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberDependencies.java
index f0b9f94..47d4223 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberDependencies.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMemberDependencies.java
@@ -18,7 +18,7 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class ObjectMemberDependencies {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/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
deleted file mode 100644
index c21fbd3..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ /dev/null
@@ -1,604 +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;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.AppManifest;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-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.commons.ensure.Assert;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.lang.ClassUtil;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
-import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
-import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
-import org.apache.isis.core.metamodel.runtimecontext.ConfigurationServiceInternal;
-import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
-import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
-import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
-import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.ObjectSpecificationDependencies;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
-import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract.IntrospectionState;
-import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
-import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
-import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
-
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.Matchers.emptyCollectionOf;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.notNullValue;
-
-/**
- * Builds the meta-model.
- * 
- * <p>
- * The implementation provides for a degree of pluggability:
- * <ul>
- * <li>The most important plug-in point is {@link ProgrammingModel} that
- * specifies the set of {@link Facet} that make up programming model. If not
- * specified then defaults to {@link ProgrammingModelFacetsJava5} (which should
- * be used as a starting point for your own customizations).
- * <li>The only mandatory plug-in point is {@link ClassSubstitutor}, which
- * allows the class to be loaded to be substituted if required. This is used in
- * conjunction with some <tt>PersistenceMechanism</tt>s that do class
- * enhancement.
- * </ul>
- * 
- * <p>
- * In addition, the {@link RuntimeContext} can optionally be injected, but will
- * default to {@link RuntimeContextNoRuntime} if not provided prior to
- * {@link SpecificationLoader#init(RuntimeContext) initialization}. The purpose of {@link RuntimeContext} is to
- * allow the metamodel to be used standalone, for example in a Maven plugin. The
- * {@link RuntimeContextNoRuntime} implementation will through an exception for
- * any methods (such as finding an {@link ObjectAdapter adapter}) because there
- * is no runtime session. In the case of the metamodel being used by the
- * framework (that is, when there <i>is</i> a runtime), then the framework
- * injects an implementation of {@link RuntimeContext} that acts like a bridge
- * to its <tt>IsisContext</tt>.
- */
-
-public class ObjectReflectorDefault
-        implements SpecificationLoader, ApplicationScopedComponent {
-
-    private final static Logger LOG = LoggerFactory.getLogger(ObjectReflectorDefault.class);
-
-    private final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
-
-    private final DeploymentCategory deploymentCategory;
-    private final ProgrammingModel programmingModel;
-    private final FacetProcessor facetProcessor;
-
-    private final ServicesInjectorSpi servicesInjector;
-
-    private final MetaModelValidator metaModelValidator;
-    private final SpecificationCacheDefault cache = new SpecificationCacheDefault();
-    private final List<LayoutMetadataReader> layoutMetadataReaders;
-
-    /**
-     * Can optionally be injected, but will default (to
-     * {@link RuntimeContextNoRuntime}) otherwise.
-     *
-     * <p>
-     * Should be injected when used by framework, but will default to a no-op implementation if the metamodel is
-     * being used standalone (eg for a code-generator).
-     */
-    private RuntimeContext runtimeContext;
-
-    private boolean initialized = false;
-    private ValidationFailures validationFailures;
-
-    // /////////////////////////////////////////////////////////////
-    // Constructor
-    // /////////////////////////////////////////////////////////////
-
-    public ObjectReflectorDefault(
-            final DeploymentCategory deploymentCategory,
-            final IsisConfiguration configuration,
-            final ProgrammingModel programmingModel,
-            final MetaModelValidator metaModelValidator,
-            final List<LayoutMetadataReader> layoutMetadataReaders,
-            final ServicesInjectorSpi servicesInjector) {
-
-        ensureThatArg(deploymentCategory, is(notNullValue()));
-        ensureThatArg(configuration, is(notNullValue()));
-        ensureThatArg(servicesInjector, is(notNullValue()));
-        ensureThatArg(programmingModel, is(notNullValue()));
-        ensureThatArg(metaModelValidator, is(notNullValue()));
-        ensureThatArg(layoutMetadataReaders, is(notNullValue()));
-        ensureThatArg(layoutMetadataReaders, is(not(emptyCollectionOf(LayoutMetadataReader.class))));
-
-        this.deploymentCategory = deploymentCategory;
-        this.servicesInjector = servicesInjector;
-
-        this.programmingModel = programmingModel;
-
-
-        this.metaModelValidator = metaModelValidator;
-        this.facetProcessor = new FacetProcessor(configuration, programmingModel);
-        this.layoutMetadataReaders = layoutMetadataReaders;
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        LOG.info("finalizing reflector factory " + this);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // init, shutdown
-    // /////////////////////////////////////////////////////////////
-
-    /**
-     * Initializes and wires up, and primes the cache based on any service
-     * classes (provided by the {@link ServicesInjectorSpi}).
-     * @param runtimeContext
-     */
-    public void init(final RuntimeContext runtimeContext) {
-
-        initialize(runtimeContext);
-
-        cacheBySpecId();
-        
-        initialized = true;
-    }
-
-    public void validateAndAssert() {
-        ValidationFailures validationFailures = validate();
-        validationFailures.assertNone();
-
-        cacheBySpecId();
-    }
-
-    public ValidationFailures validate() {
-        if(validationFailures == null) {
-            validationFailures = new ValidationFailures();
-            metaModelValidator.validate(validationFailures);
-        }
-        return validationFailures;
-    }
-
-    public void initialize(final RuntimeContext runtimeContext) {
-        this.runtimeContext = runtimeContext;
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("initialising " + this);
-        }
-
-        // default subcomponents
-        if (this.runtimeContext == null) {
-            servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, new IsisConfigurationDefault(null));
-            this.runtimeContext = new RuntimeContextNoRuntime(servicesInjector, this);
-        }
-
-        injectInto(metaModelValidator);
-
-        // wire subcomponents into each other
-        this.runtimeContext.injectInto(facetProcessor);
-        for (final LayoutMetadataReader layoutMetadataReader : layoutMetadataReaders) {
-            this.runtimeContext.injectInto(layoutMetadataReader);
-        }
-
-        // initialize subcomponents
-        programmingModel.init();
-        facetProcessor.init();
-        metaModelValidator.init();
-
-        loadSpecificationsForServices();
-        loadSpecificationsForMixins();
-    }
-
-    private void loadSpecificationsForServices() {
-        for (final Class<?> serviceClass : getServiceClasses()) {
-            final DomainService domainService = serviceClass.getAnnotation(DomainService.class);
-            if(domainService != null) {
-                if(domainService.nature() == NatureOfService.VIEW || domainService.nature() == NatureOfService.VIEW_CONTRIBUTIONS_ONLY) {
-                    internalLoadSpecification(serviceClass, domainService.nature());
-                }
-            }
-        }
-    }
-
-
-    private void loadSpecificationsForMixins() {
-        final Set<Class<?>> mixinTypes = AppManifest.Registry.instance().getMixinTypes();
-        if(mixinTypes == null) {
-            return;
-        }
-        for (final Class<?> mixinType : mixinTypes) {
-            internalLoadSpecification(mixinType);
-        }
-    }
-
-    private void cacheBySpecId() {
-        final Map<ObjectSpecId, ObjectSpecification> specById = Maps.newHashMap();
-        for (final ObjectSpecification objSpec : allSpecifications()) {
-            final ObjectSpecId objectSpecId = objSpec.getSpecId();
-            if (objectSpecId == null) {
-                continue;
-            }
-            specById.put(objectSpecId, objSpec);
-        }
-
-        getCache().setCacheBySpecId(specById);
-    }
-
-    @Override
-    public boolean isInitialized() {
-        return initialized;
-    }
-
-    public void shutdown() {
-        LOG.info("shutting down " + this);
-
-        initialized = false;
-        
-        getCache().clear();
-    }
-
-
-    @Override
-    public void invalidateCache(final Class<?> cls) {
-        
-        if(!getCache().isInitialized()) {
-            // could be called by JRebel plugin, before we are up-and-running
-            // just ignore.
-            return;
-        }
-        final Class<?> substitutedType = classSubstitutor.getClass(cls);
-        
-        if(substitutedType.isAnonymousClass()) {
-            // JRebel plugin might call us... just ignore 'em.
-            return;
-        }
-        
-        ObjectSpecification spec = loadSpecification(substitutedType);
-        while(spec != null) {
-            final Class<?> type = spec.getCorrespondingClass();
-            getCache().remove(type.getName());
-            if(spec.containsDoOpFacet(ObjectSpecIdFacet.class)) {
-                // umm.  Some specs do not have an ObjectSpecIdFacet...
-                recache(spec);
-            }
-            spec = spec.superclass(); 
-        }
-    }
-
-
-    private void recache(final ObjectSpecification newSpec) {
-        getCache().recache(newSpec);
-    }
-
-    
-
-    // /////////////////////////////////////////////////////////////
-    // install, load, allSpecifications, lookup
-    // /////////////////////////////////////////////////////////////
-
-    /**
-     * API: Return the specification for the specified class of object.
-     */
-    @Override
-    public final ObjectSpecification loadSpecification(final String className) {
-        ensureThatArg(className, is(notNullValue()), "specification class name must be specified");
-
-        try {
-            final Class<?> cls = loadBuiltIn(className);
-            return internalLoadSpecification(cls);
-        } catch (final ClassNotFoundException e) {
-            final ObjectSpecification spec = getCache().get(className);
-            if (spec == null) {
-                throw new IsisException("No such class available: " + className);
-            }
-            return spec;
-        }
-    }
-
-    /**
-     * API: Return specification.
-     */
-    @Override
-    public ObjectSpecification loadSpecification(final Class<?> type) {
-        final ObjectSpecification spec = internalLoadSpecification(type);
-        if(spec == null) {
-            return null;
-        }
-        if(getCache().isInitialized()) {
-            // umm.  It turns out that anonymous inner classes (eg org.estatio.dom.WithTitleGetter$ToString$1)
-            // don't have an ObjectSpecId; hence the guard.
-            if(spec.containsDoOpFacet(ObjectSpecIdFacet.class)) {
-                ObjectSpecId specId = spec.getSpecId();
-                if (getCache().getByObjectType(specId) == null) {
-                    getCache().recache(spec);
-                }
-            }
-        }
-        return spec;
-    }
-
-    private ObjectSpecification internalLoadSpecification(final Class<?> type) {
-        return internalLoadSpecification(type, null);
-    }
-
-    private ObjectSpecification internalLoadSpecification(final Class<?> type, final NatureOfService nature) {
-        final Class<?> substitutedType = classSubstitutor.getClass(type);
-        return substitutedType != null ? loadSpecificationForSubstitutedClass(substitutedType, nature) : null;
-    }
-
-
-    private ObjectSpecification loadSpecificationForSubstitutedClass(final Class<?> type, final NatureOfService nature) {
-        Assert.assertNotNull(type);
-        final String typeName = type.getName();
-
-        final SpecificationCacheDefault specificationCache = getCache();
-        synchronized (specificationCache) {
-            final ObjectSpecification spec = specificationCache.get(typeName);
-            if (spec != null) {
-                return spec;
-            }
-            final ObjectSpecification specification = createSpecification(type);
-            if(nature != null) {
-                specification.markAsService();
-            }
-            if (specification == null) {
-                throw new IsisException("Failed to create specification for class " + typeName);
-            }
-
-            // put into the cache prior to introspecting, to prevent
-            // infinite loops
-            specificationCache.cache(typeName, specification);
-
-            introspectIfRequired(specification);
-
-            return specification;
-        }
-    }
-
-    /**
-     * Loads the specifications of the specified types except the one specified
-     * (to prevent an infinite loop).
-     */
-    @Override
-    public boolean loadSpecifications(final List<Class<?>> typesToLoad, final Class<?> typeToIgnore) {
-        boolean anyLoadedAsNull = false;
-        for (final Class<?> typeToLoad : typesToLoad) {
-            if (typeToLoad != typeToIgnore) {
-                final ObjectSpecification noSpec = internalLoadSpecification(typeToLoad);
-                final boolean loadedAsNull = (noSpec == null);
-                anyLoadedAsNull = loadedAsNull || anyLoadedAsNull;
-            }
-        }
-        return anyLoadedAsNull;
-    }
-
-    /**
-     * Loads the specifications of the specified types.
-     */
-    @Override
-    public boolean loadSpecifications(final List<Class<?>> typesToLoad) {
-        return loadSpecifications(typesToLoad, null);
-    }
-
-    /**
-     * Creates the appropriate type of {@link ObjectSpecification}.
-     */
-    private ObjectSpecification createSpecification(final Class<?> cls) {
-
-        final ServicesInjector servicesInjector = getRuntimeContext().getServicesInjector();
-        final PersistenceSessionService persistenceSessionService = getRuntimeContext().getPersistenceSessionService();
-
-        final ObjectSpecificationDependencies specContext =
-                new ObjectSpecificationDependencies(deploymentCategory, servicesInjector, this, facetProcessor);
-
-        final ObjectMemberDependencies objectMemberDependencies =
-                new ObjectMemberDependencies(this, servicesInjector, persistenceSessionService);
-
-        // ... and create the specs
-        if (FreeStandingList.class.isAssignableFrom(cls)) {
-            return new ObjectSpecificationOnStandaloneList(specContext, objectMemberDependencies);
-        } else {
-            final FacetedMethodsBuilderContext facetedMethodsBuilderContext =
-                    new FacetedMethodsBuilderContext(
-                            this, facetProcessor, layoutMetadataReaders);
-            return new ObjectSpecificationDefault(cls, facetedMethodsBuilderContext, specContext,
-                    objectMemberDependencies);
-        }
-    }
-
-    private Class<?> loadBuiltIn(final String className) throws ClassNotFoundException {
-        final Class<?> builtIn = ClassUtil.getBuiltIn(className);
-        if (builtIn != null) {
-            return builtIn;
-        }
-        return Class.forName(className);
-    }
-
-    /**
-     * Return all the loaded specifications.
-     */
-    @Override
-    public Collection<ObjectSpecification> allSpecifications() {
-        return getCache().allSpecifications();
-    }
-
-    @Override
-    public boolean loaded(final Class<?> cls) {
-        return loaded(cls.getName());
-    }
-
-    @Override
-    public boolean loaded(final String fullyQualifiedClassName) {
-        return getCache().get(fullyQualifiedClassName) != null;
-    }
-
-    public ObjectSpecification introspectIfRequired(final ObjectSpecification spec) {
-
-        final ObjectSpecificationAbstract specSpi = (ObjectSpecificationAbstract)spec;
-        final IntrospectionState introspectionState = specSpi.getIntrospectionState();
-
-        // REVIEW: can't remember why this is done in multiple passes, could it be simplified?
-        if (introspectionState == IntrospectionState.NOT_INTROSPECTED) {
-
-            specSpi.setIntrospectionState(IntrospectionState.BEING_INTROSPECTED);
-            introspect(specSpi);
-
-        } else if (introspectionState == IntrospectionState.BEING_INTROSPECTED) {
-
-            introspect(specSpi);
-
-        } else if (introspectionState == IntrospectionState.INTROSPECTED) {
-            // nothing to do
-        }
-        return spec;
-    }
-
-    private void introspect(final ObjectSpecificationAbstract specSpi) {
-        specSpi.introspectTypeHierarchyAndMembers();
-        specSpi.updateFromFacetValues();
-        specSpi.setIntrospectionState(IntrospectionState.INTROSPECTED);
-
-    }
-
-    @Override
-    public ObjectSpecification lookupBySpecId(ObjectSpecId objectSpecId) {
-        final ObjectSpecification objectSpecification = getCache().getByObjectType(objectSpecId);
-        if(objectSpecification == null) {
-            // fallback
-            return loadSpecification(objectSpecId.asString());
-        }
-        return objectSpecification;
-    }
-
-
-    // ////////////////////////////////////////////////////////////////////
-    // injectInto
-    // ////////////////////////////////////////////////////////////////////
-
-    /**
-     * Injects self into candidate if required, and instructs its subcomponents
-     * to do so also.
-     */
-    @Override
-    public void injectInto(final Object candidate) {
-        final Class<?> candidateClass = candidate.getClass();
-        if (SpecificationLoaderAware.class.isAssignableFrom(candidateClass)) {
-            final SpecificationLoaderAware cast = SpecificationLoaderAware.class.cast(candidate);
-            cast.setSpecificationLoader(this);
-        }
-        if (SpecificationLoaderAware.class.isAssignableFrom(candidateClass)) {
-            final SpecificationLoaderAware cast = SpecificationLoaderAware.class.cast(candidate);
-            cast.setSpecificationLoader(this);
-        }
-        if (ServicesInjectorAware.class.isAssignableFrom(candidateClass)) {
-            final ServicesInjectorAware cast = ServicesInjectorAware.class.cast(candidate);
-            cast.setServicesInjector(this.servicesInjector);
-        }
-    }
-
-
-    // /////////////////////////////////////////////////////////////
-    // Helpers (were previously injected, but no longer required)
-    // /////////////////////////////////////////////////////////////
-
-    /**
-     * Provides access to the registered {@link Facet}s.
-     */
-    public FacetProcessor getFacetProcessor() {
-        return facetProcessor;
-    }
-
-    private SpecificationCacheDefault getCache() {
-        return cache;
-    }
-
-    // ////////////////////////////////////////////////////////////////////
-    // Dependencies (injected by setter due to *Aware)
-    // ////////////////////////////////////////////////////////////////////
-
-    /**
-     * Injected in {@link #initialize(RuntimeContext)}.
-     */
-    public RuntimeContext getRuntimeContext() {
-        return runtimeContext;
-    }
-
-
-    // ////////////////////////////////////////////////////////////////////
-    // Dependencies (setters, optional)
-    // ////////////////////////////////////////////////////////////////////
-
-    public List<Class<?>> getServiceClasses() {
-        List<Class<?>> serviceClasses = Lists.transform(this.servicesInjector.getRegisteredServices(), new Function<Object, Class<?>>(){
-            public Class<?> apply(Object o) {
-                return o.getClass();
-            }
-        });
-        // take a copy, to allow eg I18nFacetFactory to add in default implementations of missing services.
-        return Collections.unmodifiableList(Lists.newArrayList(serviceClasses));
-    }
-
-    public boolean isServiceClass(Class<?> cls) {
-        return this.servicesInjector.isRegisteredService(cls);
-    }
-
-    // ////////////////////////////////////////////////////////////////////
-    // Dependencies (injected from constructor)
-    // ////////////////////////////////////////////////////////////////////
-
-    protected MetaModelValidator getMetaModelValidator() {
-        return metaModelValidator;
-    }
-
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/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
deleted file mode 100644
index e982aab..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
+++ /dev/null
@@ -1,40 +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;
-
-import java.util.Collection;
-import org.apache.isis.core.commons.components.Installer;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
-import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-
-/**
- * Installs a {@link SpecificationLoader} during system start up.
- */
-public interface ObjectReflectorInstaller extends Installer {
-
-    static String TYPE = "reflector";
-
-    SpecificationLoader createReflector(
-            final DeploymentCategory deploymentCategory,
-            final Collection<MetaModelRefiner> metaModelRefiners, final ServicesInjectorSpi servicesInjector);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
new file mode 100644
index 0000000..f16375a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -0,0 +1,584 @@
+/**
+ *  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;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+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.commons.ensure.Assert;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.lang.ClassUtil;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
+import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
+import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
+import org.apache.isis.core.metamodel.runtimecontext.ConfigurationServiceInternal;
+import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
+import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
+import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
+import org.apache.isis.core.metamodel.spec.FreeStandingList;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.ObjectSpecificationDependencies;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
+import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
+import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
+import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
+import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
+import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
+import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
+
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
+import static org.hamcrest.Matchers.emptyCollectionOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Builds the meta-model.
+ *
+ * <p>
+ * The implementation provides for a degree of pluggability:
+ * <ul>
+ * <li>The most important plug-in point is {@link ProgrammingModel} that
+ * specifies the set of {@link Facet} that make up programming model. If not
+ * specified then defaults to {@link ProgrammingModelFacetsJava5} (which should
+ * be used as a starting point for your own customizations).
+ * <li>The only mandatory plug-in point is {@link ClassSubstitutor}, which
+ * allows the class to be loaded to be substituted if required. This is used in
+ * conjunction with some <tt>PersistenceMechanism</tt>s that do class
+ * enhancement.
+ * </ul>
+ *
+ * <p>
+ * In addition, the {@link RuntimeContext} can optionally be injected, but will
+ * default to {@link RuntimeContextNoRuntime} if not provided prior to
+ * {@link SpecificationLoader#init(RuntimeContext) initialization}. The purpose of {@link RuntimeContext} is to
+ * allow the metamodel to be used standalone, for example in a Maven plugin. The
+ * {@link RuntimeContextNoRuntime} implementation will through an exception for
+ * any methods (such as finding an {@link ObjectAdapter adapter}) because there
+ * is no runtime session. In the case of the metamodel being used by the
+ * framework (that is, when there <i>is</i> a runtime), then the framework
+ * injects an implementation of {@link RuntimeContext} that acts like a bridge
+ * to its <tt>IsisContext</tt>.
+ */
+public class SpecificationLoader implements ApplicationScopedComponent {
+
+    private final static Logger LOG = LoggerFactory.getLogger(SpecificationLoader.class);
+
+    //region > constructor, fields
+    private final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
+
+    private final DeploymentCategory deploymentCategory;
+    private final ProgrammingModel programmingModel;
+    private final FacetProcessor facetProcessor;
+
+    private final ServicesInjectorSpi servicesInjector;
+
+    private final MetaModelValidator metaModelValidator;
+    private final SpecificationCacheDefault cache = new SpecificationCacheDefault();
+    private final List<LayoutMetadataReader> layoutMetadataReaders;
+
+    public SpecificationLoader(
+            final DeploymentCategory deploymentCategory,
+            final IsisConfiguration configuration,
+            final ProgrammingModel programmingModel,
+            final MetaModelValidator metaModelValidator,
+            final List<LayoutMetadataReader> layoutMetadataReaders,
+            final ServicesInjectorSpi servicesInjector) {
+
+        ensureThatArg(deploymentCategory, is(notNullValue()));
+        ensureThatArg(configuration, is(notNullValue()));
+        ensureThatArg(servicesInjector, is(notNullValue()));
+        ensureThatArg(programmingModel, is(notNullValue()));
+        ensureThatArg(metaModelValidator, is(notNullValue()));
+        ensureThatArg(layoutMetadataReaders, is(notNullValue()));
+        ensureThatArg(layoutMetadataReaders, is(not(emptyCollectionOf(LayoutMetadataReader.class))));
+
+        this.deploymentCategory = deploymentCategory;
+        this.servicesInjector = servicesInjector;
+
+        this.programmingModel = programmingModel;
+
+
+        this.metaModelValidator = metaModelValidator;
+        this.facetProcessor = new FacetProcessor(configuration, programmingModel);
+        this.layoutMetadataReaders = layoutMetadataReaders;
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        super.finalize();
+        LOG.info("finalizing reflector factory " + this);
+    }
+
+    //endregion
+
+    //region > init
+
+    /**
+     * Can optionally be injected, but will default (to
+     * {@link RuntimeContextNoRuntime}) otherwise.
+     *
+     * <p>
+     * Should be injected when used by framework, but will default to a no-op implementation if the metamodel is
+     * being used standalone (eg for a code-generator).
+     */
+    private RuntimeContext runtimeContext;
+
+    private boolean initialized = false;
+
+    /**
+     * Initializes and wires up, and primes the cache based on any service
+     * classes (provided by the {@link ServicesInjectorSpi}).
+     * @param runtimeContext
+     */
+    public void init(final RuntimeContext runtimeContext) {
+        this.runtimeContext = runtimeContext;
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("initialising {}", this);
+        }
+
+        // default subcomponents
+        if (runtimeContext == null) {
+            servicesInjector.addFallbackIfRequired(
+                    ConfigurationServiceInternal.class, new IsisConfigurationDefault(null));
+            this.runtimeContext = new RuntimeContextNoRuntime(servicesInjector, this);
+        }
+
+        injectInto(metaModelValidator);
+
+        // wire subcomponents into each other
+        this.runtimeContext.injectInto(facetProcessor);
+        for (final LayoutMetadataReader layoutMetadataReader : layoutMetadataReaders) {
+            this.runtimeContext.injectInto(layoutMetadataReader);
+        }
+
+        // initialize subcomponents
+        programmingModel.init();
+        facetProcessor.init();
+        metaModelValidator.init();
+
+        loadSpecificationsForServices();
+        loadSpecificationsForMixins();
+        cacheBySpecId();
+        initialized = true;
+    }
+
+    private void loadSpecificationsForServices() {
+        for (final Class<?> serviceClass : allServiceClasses()) {
+            final DomainService domainService = serviceClass.getAnnotation(DomainService.class);
+            if(domainService != null) {
+                if(domainService.nature() == NatureOfService.VIEW || domainService.nature() == NatureOfService.VIEW_CONTRIBUTIONS_ONLY) {
+                    internalLoadSpecification(serviceClass, domainService.nature());
+                }
+            }
+        }
+    }
+
+    private void loadSpecificationsForMixins() {
+        final Set<Class<?>> mixinTypes = AppManifest.Registry.instance().getMixinTypes();
+        if(mixinTypes == null) {
+            return;
+        }
+        for (final Class<?> mixinType : mixinTypes) {
+            internalLoadSpecification(mixinType);
+        }
+    }
+
+    private void cacheBySpecId() {
+        final Map<ObjectSpecId, ObjectSpecification> specById = Maps.newHashMap();
+        for (final ObjectSpecification objSpec : allSpecifications()) {
+            final ObjectSpecId objectSpecId = objSpec.getSpecId();
+            if (objectSpecId == null) {
+                continue;
+            }
+            specById.put(objectSpecId, objSpec);
+        }
+
+        cache.setCacheBySpecId(specById);
+    }
+
+    public boolean isInitialized() {
+        return initialized;
+    }
+
+
+    /**
+     * Set using {@link #init(RuntimeContext)}.
+     */
+    public RuntimeContext getRuntimeContext() {
+        return runtimeContext;
+    }
+
+    //endregion
+
+    //region > shutdown
+
+    public void shutdown() {
+        LOG.info("shutting down " + this);
+
+        initialized = false;
+
+        cache.clear();
+    }
+
+    //endregion
+
+    //region > invalidateCache
+
+    public void invalidateCache(final Class<?> cls) {
+
+        if(!cache.isInitialized()) {
+            // could be called by JRebel plugin, before we are up-and-running
+            // just ignore.
+            return;
+        }
+        final Class<?> substitutedType = classSubstitutor.getClass(cls);
+
+        if(substitutedType.isAnonymousClass()) {
+            // JRebel plugin might call us... just ignore 'em.
+            return;
+        }
+
+        ObjectSpecification spec = loadSpecification(substitutedType);
+        while(spec != null) {
+            final Class<?> type = spec.getCorrespondingClass();
+            cache.remove(type.getName());
+            if(spec.containsDoOpFacet(ObjectSpecIdFacet.class)) {
+                // umm.  Some specs do not have an ObjectSpecIdFacet...
+                recache(spec);
+            }
+            spec = spec.superclass();
+        }
+    }
+
+
+    private void recache(final ObjectSpecification newSpec) {
+        cache.recache(newSpec);
+    }
+
+    //endregion
+
+    //region > validation
+
+    private ValidationFailures validationFailures;
+
+    public void validateAndAssert() {
+        ValidationFailures validationFailures = validate();
+        validationFailures.assertNone();
+
+        cacheBySpecId();
+    }
+
+    public ValidationFailures validate() {
+        if(validationFailures == null) {
+            validationFailures = new ValidationFailures();
+            metaModelValidator.validate(validationFailures);
+        }
+        return validationFailures;
+    }
+
+    //endregion
+
+
+    //region > loadSpecification, loadSpecifications
+
+    /**
+     * Return the specification for the specified class of object.
+     *
+     * <p>
+     * It is possible for this method to return <tt>null</tt>, for example if
+     * the configured {@link org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor}
+     * has filtered out the class.
+     */
+    public ObjectSpecification loadSpecification(final String className) {
+        ensureThatArg(className, is(notNullValue()), "specification class name must be specified");
+
+        try {
+            final Class<?> cls = loadBuiltIn(className);
+            return internalLoadSpecification(cls);
+        } catch (final ClassNotFoundException e) {
+            final ObjectSpecification spec = cache.get(className);
+            if (spec == null) {
+                throw new IsisException("No such class available: " + className);
+            }
+            return spec;
+        }
+    }
+
+    /**
+     * @see #loadSpecification(String)
+     */
+    public ObjectSpecification loadSpecification(final Class<?> type) {
+        final ObjectSpecification spec = internalLoadSpecification(type);
+        if(spec == null) {
+            return null;
+        }
+        if(cache.isInitialized()) {
+            // umm.  It turns out that anonymous inner classes (eg org.estatio.dom.WithTitleGetter$ToString$1)
+            // don't have an ObjectSpecId; hence the guard.
+            if(spec.containsDoOpFacet(ObjectSpecIdFacet.class)) {
+                ObjectSpecId specId = spec.getSpecId();
+                if (cache.getByObjectType(specId) == null) {
+                    cache.recache(spec);
+                }
+            }
+        }
+        return spec;
+    }
+
+    private ObjectSpecification internalLoadSpecification(final Class<?> type) {
+        return internalLoadSpecification(type, null);
+    }
+
+    private ObjectSpecification internalLoadSpecification(final Class<?> type, final NatureOfService nature) {
+        final Class<?> substitutedType = classSubstitutor.getClass(type);
+        return substitutedType != null ? loadSpecificationForSubstitutedClass(substitutedType, nature) : null;
+    }
+
+    private ObjectSpecification loadSpecificationForSubstitutedClass(final Class<?> type, final NatureOfService nature) {
+        Assert.assertNotNull(type);
+        final String typeName = type.getName();
+
+        final SpecificationCacheDefault specificationCache = cache;
+        synchronized (specificationCache) {
+            final ObjectSpecification spec = specificationCache.get(typeName);
+            if (spec != null) {
+                return spec;
+            }
+            final ObjectSpecification specification = createSpecification(type);
+            if(nature != null) {
+                specification.markAsService();
+            }
+            if (specification == null) {
+                throw new IsisException("Failed to create specification for class " + typeName);
+            }
+
+            // put into the cache prior to introspecting, to prevent
+            // infinite loops
+            specificationCache.cache(typeName, specification);
+
+            introspectIfRequired(specification);
+
+            return specification;
+        }
+    }
+
+    /**
+     * Loads the specifications of the specified types except the one specified
+     * (to prevent an infinite loop).
+     */
+    public boolean loadSpecifications(final List<Class<?>> typesToLoad, final Class<?> typeToIgnore) {
+        boolean anyLoadedAsNull = false;
+        for (final Class<?> typeToLoad : typesToLoad) {
+            if (typeToLoad != typeToIgnore) {
+                final ObjectSpecification noSpec = internalLoadSpecification(typeToLoad);
+                final boolean loadedAsNull = (noSpec == null);
+                anyLoadedAsNull = loadedAsNull || anyLoadedAsNull;
+            }
+        }
+        return anyLoadedAsNull;
+    }
+
+    /**
+     * Loads the specifications of the specified types.
+     */
+    public boolean loadSpecifications(final List<Class<?>> typesToLoad) {
+        return loadSpecifications(typesToLoad, null);
+    }
+
+    /**
+     * Creates the appropriate type of {@link ObjectSpecification}.
+     */
+    private ObjectSpecification createSpecification(final Class<?> cls) {
+
+        final ServicesInjector servicesInjector = getRuntimeContext().getServicesInjector();
+        final PersistenceSessionService persistenceSessionService = getRuntimeContext().getPersistenceSessionService();
+
+        final ObjectSpecificationDependencies specContext =
+                new ObjectSpecificationDependencies(deploymentCategory, servicesInjector, this, facetProcessor);
+
+        final ObjectMemberDependencies objectMemberDependencies =
+                new ObjectMemberDependencies(this, servicesInjector, persistenceSessionService);
+
+        // ... and create the specs
+        if (FreeStandingList.class.isAssignableFrom(cls)) {
+            return new ObjectSpecificationOnStandaloneList(specContext, objectMemberDependencies);
+        } else {
+            final FacetedMethodsBuilderContext facetedMethodsBuilderContext =
+                    new FacetedMethodsBuilderContext(
+                            this, facetProcessor, layoutMetadataReaders);
+            return new ObjectSpecificationDefault(cls, facetedMethodsBuilderContext, specContext,
+                    objectMemberDependencies);
+        }
+    }
+
+    private Class<?> loadBuiltIn(final String className) throws ClassNotFoundException {
+        final Class<?> builtIn = ClassUtil.getBuiltIn(className);
+        if (builtIn != null) {
+            return builtIn;
+        }
+        return Class.forName(className);
+    }
+
+    /**
+     * Typically does not need to be called, but is available for {@link FacetFactory}s to force
+     * early introspection of referenced specs in certain circumstances.
+     *
+     * <p>
+     * Originally introduced to support {@link AutoCompleteFacet}.
+     */
+    private ObjectSpecification introspectIfRequired(final ObjectSpecification spec) {
+
+        final ObjectSpecificationAbstract specSpi = (ObjectSpecificationAbstract)spec;
+        final ObjectSpecificationAbstract.IntrospectionState introspectionState = specSpi.getIntrospectionState();
+
+        // REVIEW: can't remember why this is done in multiple passes, could it be simplified?
+        if (introspectionState == ObjectSpecificationAbstract.IntrospectionState.NOT_INTROSPECTED) {
+
+            specSpi.setIntrospectionState(ObjectSpecificationAbstract.IntrospectionState.BEING_INTROSPECTED);
+            introspect(specSpi);
+
+        } else if (introspectionState == ObjectSpecificationAbstract.IntrospectionState.BEING_INTROSPECTED) {
+
+            introspect(specSpi);
+
+        } else if (introspectionState == ObjectSpecificationAbstract.IntrospectionState.INTROSPECTED) {
+            // nothing to do
+        }
+        return spec;
+    }
+
+    private void introspect(final ObjectSpecificationAbstract specSpi) {
+        specSpi.introspectTypeHierarchyAndMembers();
+        specSpi.updateFromFacetValues();
+        specSpi.setIntrospectionState(ObjectSpecificationAbstract.IntrospectionState.INTROSPECTED);
+
+    }
+
+    //endregion
+
+    //region > allSpecifications
+    /**
+     * Return all the loaded specifications.
+     */
+    public Collection<ObjectSpecification> allSpecifications() {
+        return cache.allSpecifications();
+    }
+
+    //endregion
+
+    //region > getServiceClasses, isServiceClass
+
+    public List<Class<?>> allServiceClasses() {
+        List<Class<?>> serviceClasses = Lists
+                .transform(this.servicesInjector.getRegisteredServices(), new Function<Object, Class<?>>(){
+                    public Class<?> apply(Object o) {
+                        return o.getClass();
+                    }
+                });
+        // take a copy, to allow eg I18nFacetFactory to add in default implementations of missing services.
+        return Collections.unmodifiableList(Lists.newArrayList(serviceClasses));
+    }
+
+    public boolean isServiceClass(Class<?> cls) {
+        return this.servicesInjector.isRegisteredService(cls);
+    }
+
+    //endregion
+
+    //region > loaded
+    /**
+     * Whether this class has been loaded.
+     */
+    public boolean loaded(final Class<?> cls) {
+        return loaded(cls.getName());
+    }
+
+    /**
+     * @see #loaded(Class).
+     */
+    public boolean loaded(final String fullyQualifiedClassName) {
+        return cache.get(fullyQualifiedClassName) != null;
+    }
+
+    //endregion
+
+    //region > lookupBySpecId
+    public ObjectSpecification lookupBySpecId(ObjectSpecId objectSpecId) {
+        final ObjectSpecification objectSpecification = cache.getByObjectType(objectSpecId);
+        if(objectSpecification == null) {
+            // fallback
+            return loadSpecification(objectSpecId.asString());
+        }
+        return objectSpecification;
+    }
+    //endregion
+
+
+
+    /**
+     * Injects self into candidate if required, and instructs its subcomponents
+     * to do so also.
+     */
+    public void injectInto(final Object candidate) {
+        final Class<?> candidateClass = candidate.getClass();
+        if (SpecificationLoaderAware.class.isAssignableFrom(candidateClass)) {
+            final SpecificationLoaderAware cast = SpecificationLoaderAware.class.cast(candidate);
+            cast.setSpecificationLoader(this);
+        }
+        if (SpecificationLoaderAware.class.isAssignableFrom(candidateClass)) {
+            final SpecificationLoaderAware cast = SpecificationLoaderAware.class.cast(candidate);
+            cast.setSpecificationLoader(this);
+        }
+        if (ServicesInjectorAware.class.isAssignableFrom(candidateClass)) {
+            final ServicesInjectorAware cast = ServicesInjectorAware.class.cast(candidate);
+            cast.setServicesInjector(this.servicesInjector);
+        }
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderAware.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderAware.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderAware.java
new file mode 100644
index 0000000..8f60a85
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderAware.java
@@ -0,0 +1,29 @@
+/*
+ *  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;
+
+import org.apache.isis.applib.annotation.Programmatic;
+
+public interface SpecificationLoaderAware {
+
+    @Programmatic
+    public void setSpecificationLoader(final SpecificationLoader specificationLookup);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/04bf1f22/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderInstaller.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderInstaller.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderInstaller.java
new file mode 100644
index 0000000..cd6a86c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderInstaller.java
@@ -0,0 +1,40 @@
+/*
+ *  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;
+
+import java.util.Collection;
+import org.apache.isis.core.commons.components.Installer;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
+
+/**
+ * Installs a {@link SpecificationLoader} during system start up.
+ */
+public interface SpecificationLoaderInstaller extends Installer {
+
+    static String TYPE = "reflector";
+
+    SpecificationLoader createReflector(
+            final DeploymentCategory deploymentCategory,
+            final Collection<MetaModelRefiner> metaModelRefiners,
+            final ServicesInjectorSpi servicesInjector);
+
+}