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

[2/5] git commit: ISIS-918: first pass at removing DomainObjectContainer. The app seemingly runs up fine, but still need to look at tests.

ISIS-918: first pass at removing DomainObjectContainer.  The app seemingly runs up fine, but still need to look at tests.


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

Branch: refs/heads/master
Commit: 98635d378e1dbf13dc73d70ac7ef11d7bd0025de
Parents: 1a104fc
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Oct 6 21:24:15 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Oct 6 21:24:15 2014 +0100

----------------------------------------------------------------------
 .../isis/applib/DomainObjectContainer.java      | 45 ++++++++++-
 .../integtestsupport/IsisSystemForTest.java     | 12 +--
 .../IsisSystemWithFixtures.java                 | 49 +++++------
 .../isis/core/metamodel/app/IsisMetaModel.java  | 65 +++------------
 .../runtimecontext/RuntimeContext.java          | 36 +++------
 .../runtimecontext/RuntimeContextAbstract.java  | 30 +------
 .../runtimecontext/ServicesInjector.java        |  3 -
 .../services/ServicesInjectorDefault.java       | 34 +-------
 .../metamodel/services/ServicesInjectorSpi.java | 27 -------
 .../container/DomainObjectContainerAware.java   | 28 -------
 .../container/DomainObjectContainerDefault.java | 85 +++++++++++++++-----
 .../metamodel/spec/SpecificationLoaderSpi.java  | 10 +--
 .../specloader/ObjectReflectorDefault.java      |  9 ---
 ...sMetaModelTest_getDomainObjectContainer.java | 12 ---
 .../metamodel/app/IsisMetaModelTest_init.java   |  7 --
 .../metamodel/facets/ProgrammableReflector.java |  5 --
 .../services/ServicesInjectorDefaultTest.java   |  3 +-
 ...ServicesInjectorDefaultTest_usingFields.java | 17 +---
 .../ObjectReflectorDefaultTestAbstract.java     |  3 +-
 .../persistence/PersistenceConstants.java       | 10 ---
 .../PersistenceSessionFactoryDelegating.java    | 23 +-----
 .../ServicesInstallerFromAnnotation.java        |  7 +-
 .../system/IsisSystemFixturesHookAbstract.java  | 26 +-----
 .../persistence/PersistenceSessionFactory.java  |  5 +-
 .../system/session/IsisSessionFactory.java      |  1 -
 .../session/IsisSessionFactoryDefault.java      |  8 --
 .../IsisSystemAbstract.java                     |  7 +-
 .../core/runtime/context/IsisContextTest.java   |  2 +-
 .../PersistenceSessionObjectStoreTest.java      | 26 ++----
 ...onFactoryAbstractTest_init_and_shutdown.java |  2 +-
 30 files changed, 193 insertions(+), 404 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java b/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
index 8972a66..bcd7620 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
@@ -24,6 +24,7 @@ import java.util.List;
 import com.google.common.base.Predicate;
 
 import org.apache.isis.applib.annotation.Aggregated;
+import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.security.UserMemento;
@@ -43,6 +44,7 @@ public interface DomainObjectContainer {
      * Return the title of the object, as rendered in the UI by the 
      * Isis viewers.
      */
+    @Programmatic
     String titleOf(Object domainObject);
 
     // ////////////////////////////////////////////////////////////////
@@ -62,6 +64,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated
      */
+    @Programmatic
     @Deprecated
     void resolve(Object domainObject);
 
@@ -79,6 +82,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated
      */
+    @Programmatic
     @Deprecated
     void resolve(Object domainObject, Object field);
 
@@ -92,6 +96,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated
      */
+    @Programmatic
     @Deprecated
     void objectChanged(Object domainObject);
 
@@ -108,6 +113,7 @@ public interface DomainObjectContainer {
      * 
      * @return  - is never used, always returns <tt>false</tt>. 
      */
+    @Programmatic
     boolean flush();
 
     /**
@@ -120,6 +126,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated
      */
+    @Programmatic
     @Deprecated
     void commit();
 
@@ -160,6 +167,7 @@ public interface DomainObjectContainer {
      * @see #newPersistentInstance(Class)
      * @see #newAggregatedInstance(Object, Class)
      */
+    @Programmatic
     <T> T newTransientInstance(final Class<T> ofType);
 
     
@@ -173,6 +181,7 @@ public interface DomainObjectContainer {
      *     If services need injecting into it, use {@link #injectServicesInto(Object)}.
      * </p>
      */
+    @Programmatic
     <T extends ViewModel> T newViewModelInstance(final Class<T> ofType, final String memento);
 
     /**
@@ -183,6 +192,7 @@ public interface DomainObjectContainer {
      * <b>Note:</b> not every objectstore implementation supports the concept
      * of aggregated instances.
      */
+    @Programmatic
     <T> T newAggregatedInstance(Object parent, Class<T> ofType);
 
     /**
@@ -199,6 +209,7 @@ public interface DomainObjectContainer {
      *  
      * @deprecated
      */
+    @Programmatic
     @Deprecated
     <T> T newPersistentInstance(final Class<T> ofType);
 
@@ -212,6 +223,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated
      */
+    @Programmatic
     @Deprecated
     <T> T newInstance(final Class<T> ofType, final Object object);
 
@@ -219,6 +231,7 @@ public interface DomainObjectContainer {
     // injectServicesInto
     // ////////////////////////////////////////////////////////////////
 
+    @Programmatic
     <T> T injectServicesInto(final T domainObject);
 
     // ////////////////////////////////////////////////////////////////
@@ -231,6 +244,7 @@ public interface DomainObjectContainer {
      * 
      * @see #validate(Object)
      */
+    @Programmatic
     boolean isValid(Object domainObject);
 
     /**
@@ -242,6 +256,7 @@ public interface DomainObjectContainer {
      * 
      * @see #isValid(Object)
      */
+    @Programmatic
     String validate(Object domainObject);
 
     // ////////////////////////////////////////////////////////////////
@@ -252,6 +267,7 @@ public interface DomainObjectContainer {
      * Determines if the specified object is persistent (that it is stored
      * permanently outside of the virtual machine).
      */
+    @Programmatic
     boolean isPersistent(Object domainObject);
 
     /**
@@ -271,6 +287,7 @@ public interface DomainObjectContainer {
      * @see #isPersistent(Object)
      * @see #persistIfNotAlready(Object)
      */
+    @Programmatic
     void persist(Object domainObject);
 
     /**
@@ -286,6 +303,7 @@ public interface DomainObjectContainer {
      * @see #isPersistent(Object)
      * @see #persist(Object)
      */
+    @Programmatic
     void persistIfNotAlready(Object domainObject);
 
     /**
@@ -293,6 +311,7 @@ public interface DomainObjectContainer {
      * 
      * @param persistentDomainObject
      */
+    @Programmatic
     void remove(Object persistentDomainObject);
 
     /**
@@ -300,6 +319,7 @@ public interface DomainObjectContainer {
      * 
      * @param domainObject
      */
+    @Programmatic
     void removeIfNotAlready(Object domainObject);
 
     // ////////////////////////////////////////////////////////////////
@@ -314,6 +334,7 @@ public interface DomainObjectContainer {
      * @see #warnUser(String)
      * @see #raiseError(String)
      */
+    @Programmatic
     void informUser(String message);
 
     /**
@@ -324,6 +345,7 @@ public interface DomainObjectContainer {
      * @see #raiseError(String)
      * @see #informUser(String)
      */
+    @Programmatic
     void warnUser(String message);
 
     /**
@@ -335,6 +357,7 @@ public interface DomainObjectContainer {
      * @see #warnUser(String)
      * @see #informUser(String)
      */
+    @Programmatic
     void raiseError(String message);
 
     // ////////////////////////////////////////////////////////////////
@@ -344,17 +367,20 @@ public interface DomainObjectContainer {
     /**
      * Get the configuration property with the specified name.
      */
+    @Programmatic
     String getProperty(String name);
 
     /**
      * Get the configuration property with the specified name and if it doesn't
      * exist then return the specified default value.
      */
+    @Programmatic
     String getProperty(String name, String defaultValue);
 
     /**
      * Get the names of all the available properties.
      */
+    @Programmatic
     List<String> getPropertyNames();
 
     // ////////////////////////////////////////////////////////////////
@@ -364,6 +390,7 @@ public interface DomainObjectContainer {
     /**
      * Get the details about the current user.
      */
+    @Programmatic
     UserMemento getUser();
 
     // ////////////////////////////////////////////////////////////////
@@ -387,6 +414,7 @@ public interface DomainObjectContainer {
      * 
      * @param range 2 longs, specifying 0-based start and count.
      */
+    @Programmatic
     public <T> List<T> allInstances(Class<T> ofType, long... range);
 
     /**
@@ -407,6 +435,7 @@ public interface DomainObjectContainer {
      * 
      * @param range 2 longs, specifying 0-based start and count.
      */
+    @Programmatic
     public <T> List<T> allMatches(final Class<T> ofType, final Predicate<? super T> predicate, long... range);
     
     /**
@@ -429,6 +458,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated - use {@link #allMatches(Class, Predicate, long...)} instead.
      */
+    @Programmatic
     @Deprecated
     public <T> List<T> allMatches(final Class<T> ofType, final Filter<? super T> filter, long... range);
 
@@ -450,6 +480,7 @@ public interface DomainObjectContainer {
      * 
      * @param range 2 longs, specifying 0-based start and count.
      */
+    @Programmatic
     public <T> List<T> allMatches(Class<T> ofType, String title, long... range);
 
     /**
@@ -471,6 +502,7 @@ public interface DomainObjectContainer {
      * 
      * @param range 2 longs, specifying 0-based start and count.
      */
+    @Programmatic
     <T> List<T> allMatches(Class<T> ofType, T pattern, long... range);
 
     /**
@@ -482,6 +514,7 @@ public interface DomainObjectContainer {
      * use or modify the returned {@link List}, but the changes will not be
      * reflected back to the repository.
      */
+    @Programmatic
     <T> List<T> allMatches(Query<T> query);
 
     // //////////////////////////////////////
@@ -494,6 +527,7 @@ public interface DomainObjectContainer {
      * This method is useful during exploration/prototyping, but you may want to
      * use {@link #firstMatch(Query)} for production code.
      */
+    @Programmatic
     public <T> T firstMatch(final Class<T> ofType, final Predicate<T> predicate);
     
     /**
@@ -506,6 +540,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated - use {@link #firstMatch(Class, Predicate)}
      */
+    @Programmatic
     @Deprecated
     public <T> T firstMatch(final Class<T> ofType, final Filter<T> filter);
 
@@ -517,6 +552,7 @@ public interface DomainObjectContainer {
      * This method is useful during exploration/prototyping, but you may want to
      * use {@link #firstMatch(Query)} for production code.
      */
+    @Programmatic
     <T> T firstMatch(Class<T> ofType, String title);
 
     /**
@@ -527,12 +563,14 @@ public interface DomainObjectContainer {
      * This method is useful during exploration/prototyping, but you may want to
      * use {@link #firstMatch(Query)} for production code.
      */
+    @Programmatic
     <T> T firstMatch(Class<T> ofType, T pattern);
 
     /**
      * Returns the first instance that matches the supplied query, or
      * <tt>null</tt> if none.
      */
+    @Programmatic
     <T> T firstMatch(Query<T> query);
 
     // //////////////////////////////////////
@@ -549,6 +587,7 @@ public interface DomainObjectContainer {
      * This method is useful during exploration/prototyping, but you may want to
      * use {@link #uniqueMatch(Query)} for production code.
      */
+    @Programmatic
     public <T> T uniqueMatch(final Class<T> ofType, final Predicate<T> predicate);
 
     /**
@@ -565,6 +604,7 @@ public interface DomainObjectContainer {
      * 
      * @deprecated - use {@link #uniqueMatch(Class, Predicate)}
      */
+    @Programmatic
     @Deprecated
     public <T> T uniqueMatch(final Class<T> ofType, final Filter<T> filter);
     
@@ -580,6 +620,7 @@ public interface DomainObjectContainer {
      * This method is useful during exploration/prototyping, but you may want to
      * use {@link #uniqueMatch(Query)} for production code.
      */
+    @Programmatic
     <T> T uniqueMatch(Class<T> ofType, String title);
 
     /**
@@ -596,15 +637,17 @@ public interface DomainObjectContainer {
      * This method is useful during exploration/prototyping, but you may want to
      * use {@link #uniqueMatch(Query)} for production code.
      */
+    @Programmatic
     <T> T uniqueMatch(Class<T> ofType, T pattern);
 
     /**
      * Find the only instance that matches the provided query.
-     * 
+     *
      * <p>
      * If no instance is found then null will be return, while if there is more
      * that one instances a run-time exception will be thrown.
      */
+    @Programmatic
     <T> T uniqueMatch(Query<T> query);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index 08cae1e..a8b22ff 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -363,9 +363,14 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
             return this == FIRE;
         }
     }
-    
+
     public DomainObjectContainer getContainer() {
-        return getPersistenceSession().getServicesInjector().getContainer();
+        for (Object service : services) {
+            if(service instanceof DomainObjectContainer) {
+                return (DomainObjectContainer) service;
+            }
+        }
+        throw new IllegalStateException("Could not locate DomainObjectContainer");
     }
 
     /**
@@ -505,9 +510,6 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
 
     /**
      * The {@link AuthenticationSession} created during {@link #setUpSystem()}.
-     * 
-     * <p>
-     * Can fine-tune before hand using {@link #createAuthenticationRequest()}.
      */
     public AuthenticationSession getAuthenticationSession() {
         return authenticationSession;

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemWithFixtures.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemWithFixtures.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemWithFixtures.java
index 0a84fa3..debe4ce 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemWithFixtures.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemWithFixtures.java
@@ -21,19 +21,12 @@ package org.apache.isis.core.integtestsupport;
 
 import java.util.Arrays;
 import java.util.List;
-
 import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
-
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -57,11 +50,7 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction.State;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.security.authentication.AuthenticationRequestNameOnly;
-import org.apache.isis.core.tck.dom.refs.AggregatedEntity;
-import org.apache.isis.core.tck.dom.refs.ParentEntity;
-import org.apache.isis.core.tck.dom.refs.ParentEntityRepository;
-import org.apache.isis.core.tck.dom.refs.ReferencingEntity;
-import org.apache.isis.core.tck.dom.refs.SimpleEntity;
+import org.apache.isis.core.tck.dom.refs.*;
 import org.apache.isis.core.tck.dom.scalars.ApplibValuedEntity;
 import org.apache.isis.core.tck.dom.scalars.JdkValuedEntity;
 import org.apache.isis.core.tck.dom.scalars.PrimitiveValuedEntity;
@@ -75,6 +64,7 @@ import org.apache.isis.core.tck.dom.scalars.WrapperValuedEntity;
  */
 public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
 
+
     public interface Listener {
 
         void init(IsisConfiguration configuration) throws Exception;
@@ -228,6 +218,7 @@ public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
         private Object[] services;
 
 
+
         public Builder with(IsisConfiguration configuration) {
             this.configuration = configuration;
             return this;
@@ -312,11 +303,11 @@ public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
         org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
 
         boolean firstTime = isisSystem == null;
-        if(fireListeners.shouldFire()) {
+        if (fireListeners.shouldFire()) {
             fireInitAndPreSetupSystem(firstTime);
         }
-        
-        if(firstTime) {
+
+        if (firstTime) {
             isisSystem = createIsisSystem(services);
             isisSystem.init();
             IsisContext.closeSession();
@@ -326,16 +317,27 @@ public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
         authenticationSession = authenticationManager.authenticate(authenticationRequest);
 
         IsisContext.openSession(authenticationSession);
-        
-        container = getContainer();
-        if(firstTime && fixturesInitialization == Fixtures.Initialization.INIT) {
+
+        DomainObjectContainer container = lookupContainer();
+        if (firstTime && fixturesInitialization == Fixtures.Initialization.INIT) {
             fixtures.init(container);
         }
-        if(fireListeners.shouldFire()) {
+        if (fireListeners.shouldFire()) {
             firePostSetupSystem(firstTime);
         }
+
     }
 
+    private DomainObjectContainer lookupContainer() {
+        for (Object service : services) {
+            if(service instanceof DomainObjectContainer) {
+                return (DomainObjectContainer) service;
+            }
+        }
+        throw new IllegalStateException("Could not locate DomainObjectContainer");
+    }
+
+
     private enum FireListeners {
         FIRE,
         DONT_FIRE;
@@ -344,9 +346,6 @@ public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
         }
     }
     
-    private DomainObjectContainer getContainer() {
-        return getPersistenceSession().getServicesInjector().getContainer();
-    }
 
     /**
      * Intended to be called from a test's {@link After} method.
@@ -463,9 +462,6 @@ public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
 
     /**
      * The {@link IsisSystemDefault} created during {@link #setUpSystem()}.
-     * 
-     * <p>
-     * Can fine-tune the actual implementation using the hook {@link #createIsisSystem()}.
      */
     public IsisSystemDefault getIsisSystem() {
         return isisSystem;
@@ -473,9 +469,6 @@ public class IsisSystemWithFixtures implements org.junit.rules.TestRule {
 
     /**
      * The {@link AuthenticationSession} created during {@link #setUpSystem()}.
-     * 
-     * <p>
-     * Can fine-tune before hand using {@link #createAuthenticationRequest()}.
      */
     public AuthenticationSession getAuthenticationSession() {
         return authenticationSession;

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 8e86637..7ab73bd 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
@@ -19,28 +19,16 @@
 
 package org.apache.isis.core.metamodel.app;
 
-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;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
+import java.util.*;
 import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.DomainObjectContainer;
 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.facetdecorator.FacetDecorator;
+import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
 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.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -53,7 +41,11 @@ import org.apache.isis.core.metamodel.specloader.traverser.SpecificationTraverse
 import org.apache.isis.core.metamodel.specloader.traverser.SpecificationTraverserDefault;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
+
+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.
@@ -83,15 +75,12 @@ public class IsisMetaModel implements ApplicationScopedComponent {
     private Set<FacetDecorator> facetDecorators;
     private MetaModelValidator metaModelValidator;
 
-    private DomainObjectContainer container;
-
     private ValidationFailures validationFailures;
 
     
     public static class Builder {
         private final RuntimeContext runtimeContext;
         private final ProgrammingModel programmingModel;
-        private DomainObjectContainer container = new DomainObjectContainerDefault();
         private List<Object> services = Lists.newArrayList();
         
         private Builder(RuntimeContext embeddedContext, ProgrammingModel programmingModel) {
@@ -99,11 +88,6 @@ public class IsisMetaModel implements ApplicationScopedComponent {
             this.programmingModel = programmingModel;
         }
         
-        public Builder with(DomainObjectContainer container) {
-            this.container = container;
-            return this;
-        }
-        
         public Builder withServices(Object... services) {
             return withServices(Arrays.asList(services));
         }
@@ -114,11 +98,7 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         }
         
         public IsisMetaModel build() {
-            final IsisMetaModel isisMetaModel = new IsisMetaModel(runtimeContext, programmingModel, services);
-            if(container != null) {
-                isisMetaModel.setContainer(container);
-            }
-            return isisMetaModel;
+            return new IsisMetaModel(runtimeContext, programmingModel, services);
         }
     }
     
@@ -133,8 +113,9 @@ public class IsisMetaModel implements ApplicationScopedComponent {
     public IsisMetaModel(final RuntimeContext runtimeContext, ProgrammingModel programmingModel, final Object... services) {
         this.runtimeContext = runtimeContext;
 
-        setContainer(new DomainObjectContainerDefault());
+        this.services.add(new DomainObjectContainerDefault());
         this.services.addAll(Arrays.asList(services));
+
         setConfiguration(new IsisConfigurationDefault());
         setClassSubstitutor(new ClassSubstitutorAbstract() {});
         setCollectionTypeRegistry(new CollectionTypeRegistryDefault());
@@ -145,18 +126,8 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         setMetaModelValidator(new MetaModelValidatorDefault());
     }
 
-    private void setContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-
     /**
-     * The list of classes representing services, as specified in the
-     * {@link #IsisMetaModel(EmbeddedContext, Class...) constructor}.
-     * 
-     * <p>
-     * To obtain the instantiated services, use the
-     * {@link ServicesInjectorSpi#getRegisteredServices()} (available from
-     * {@link #getServicesInjector()}).
+     * The list of classes representing services.
      */
     public List<Object> getServices() {
         return Collections.unmodifiableList(services);
@@ -171,11 +142,8 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         ensureNotInitialized();
         reflector = new ObjectReflectorDefault(configuration, classSubstitutor, collectionTypeRegistry, specificationTraverser, programmingModel, facetDecorators, metaModelValidator);
 
-        reflector.setContainer(container);
         reflector.setServices(services);
         
-        runtimeContext.injectInto(container);
-        runtimeContext.setContainer(container);
         runtimeContext.injectInto(reflector);
         reflector.injectInto(runtimeContext);
 
@@ -211,17 +179,6 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         return reflector;
     }
 
-    // ///////////////////////////////////////////////////////
-    // DomainObjectContainer
-    // ///////////////////////////////////////////////////////
-
-    /**
-     * Available once {@link #init() initialized}.
-     */
-    public DomainObjectContainer getDomainObjectContainer() {
-        ensureInitialized();
-        return container;
-    }
 
     // ///////////////////////////////////////////////////////
     // DependencyInjector

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 e5fbc52..696812b 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
@@ -78,11 +78,9 @@ public interface RuntimeContext extends Injectable, ApplicationScopedComponent {
 
 
     // ///////////////////////////////////////////
-    // container
+    // transaction state
     // ///////////////////////////////////////////
 
-    public void setContainer(DomainObjectContainer container);
-
     public TransactionState getTransactionState();
 
     public static enum TransactionState {
@@ -95,19 +93,15 @@ public interface RuntimeContext extends Injectable, ApplicationScopedComponent {
          * Started, still in progress.
          * 
          * <p>
-         * May {@link IsisTransaction#flush() flush},
-         * {@link IsisTransaction#commit() commit} or
-         * {@link IsisTransaction#abort() abort}.
+         * May flush, commit or abort.
          */
         IN_PROGRESS,
         /**
          * Started, but has hit an exception.
          * 
          * <p>
-         * May not {@link IsisTransaction#flush()} or
-         * {@link IsisTransaction#commit() commit} (will throw an
-         * {@link IllegalStateException}), but can only
-         * {@link IsisTransaction#abort() abort}.
+         * May not flush or commit (will throw an {@link IllegalStateException}),
+         * can only abort.
          * 
          * <p>
          * Similar to <tt>setRollbackOnly</tt> in EJBs.
@@ -117,52 +111,42 @@ public interface RuntimeContext extends Injectable, ApplicationScopedComponent {
          * Completed, having successfully committed.
          * 
          * <p>
-         * May not {@link IsisTransaction#flush()} or
-         * {@link IsisTransaction#abort() abort} or
-         * {@link IsisTransaction#commit() commit} (will throw
-         * {@link IllegalStateException}).
+         * May not flush or abort or commit (will throw {@link IllegalStateException}).
          */
         COMMITTED,
         /**
          * Completed, having aborted.
          * 
          * <p>
-         * May not {@link IsisTransaction#flush()},
-         * {@link IsisTransaction#commit() commit} or
-         * {@link IsisTransaction#abort() abort} (will throw
-         * {@link IllegalStateException}).
+         * May not flush, commit or abort (will throw {@link IllegalStateException}).
          */
         ABORTED;
 
         private TransactionState(){}
 
         /**
-         * Whether it is valid to {@link IsisTransaction#flush() flush} this
-         * {@link IsisTransaction transaction}.
+         * Whether it is valid to flush the transaction.
          */
         public boolean canFlush() {
             return this == IN_PROGRESS;
         }
 
         /**
-         * Whether it is valid to {@link IsisTransaction#commit() commit} this
-         * {@link IsisTransaction transaction}.
+         * Whether it is valid to commit the transaction.
          */
         public boolean canCommit() {
             return this == IN_PROGRESS;
         }
 
         /**
-         * Whether it is valid to {@link IsisTransaction#markAsAborted() abort} this
-         * {@link IsisTransaction transaction}.
+         * Whether it is valid to mark as aborted this transaction}.
          */
         public boolean canAbort() {
             return this == IN_PROGRESS || this == MUST_ABORT;
         }
 
         /**
-         * Whether the {@link IsisTransaction transaction} is complete (and so a
-         * new one can be started).
+         * Whether the transaction is complete (and so a new one can be started).
          */
         public boolean isComplete() {
             return this == COMMITTED || this == ABORTED;

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 6f41fe3..1e0243a 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
@@ -22,23 +22,13 @@ package org.apache.isis.core.metamodel.runtimecontext;
 import java.util.Collection;
 import java.util.List;
 import java.util.Properties;
-
 import com.google.common.collect.Lists;
+import org.apache.isis.core.metamodel.spec.*;
 
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.metamodel.services.container.DomainObjectContainerAware;
-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, DomainObjectContainerAware {
+public abstract class RuntimeContextAbstract implements RuntimeContext, SpecificationLoaderSpiAware {
 
     private final SpecificationLoaderDelegator specificationLookupDelegator = new SpecificationLoaderDelegator();
     
-    private DomainObjectContainer container;
     private Properties properties;
 
 
@@ -80,8 +70,7 @@ public abstract class RuntimeContextAbstract implements RuntimeContext, Specific
     }
 
     /**
-     * Is injected into when the reflector is
-     * {@link ObjectReflectorAbstract#init() initialized}.
+     * Is injected into when the reflector is reflector isinitialized.
      */
     @Override
     public void setSpecificationLoaderSpi(final SpecificationLoaderSpi specificationLoader) {
@@ -149,19 +138,6 @@ public abstract class RuntimeContextAbstract implements RuntimeContext, Specific
         });
     }
 
-    protected DomainObjectContainer getContainer() {
-        return container;
-    }
-
-    /**
-     * So that {@link #injectServicesInto(Object)} can also inject the
-     * {@link DomainObjectContainer}.
-     */
-    @Override
-    public void setContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-
     public void setProperties(final Properties properties) {
         this.properties = properties;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 9af283f..d1bcf08 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
@@ -26,9 +26,6 @@ public interface ServicesInjector extends Injectable {
 
     /**
      * All registered services, as an immutable {@link List}.
-     * 
-     * <p>
-     * Does not include the {@link #getContainer() container}.
      */
     List<Object> getRegisteredServices();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 f1f1a38..2687e1b 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
@@ -33,16 +33,12 @@ 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.DomainObjectContainer;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.CoreMatchers.*;
-
 /**
  * Must be a thread-safe.
  */
@@ -56,7 +52,6 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
      */
     private final Map<Class<?>, List<Object>> servicesByType = Maps.newHashMap();
 
-    private DomainObjectContainer container;
     private final List<Object> services = Lists.newArrayList();
 
     
@@ -75,22 +70,6 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
     }
 
     // /////////////////////////////////////////////////////////
-    // Container
-    // /////////////////////////////////////////////////////////
-
-    @Override
-    public DomainObjectContainer getContainer() {
-        return container;
-    }
-
-    @Override
-    public void setContainer(final DomainObjectContainer container) {
-        ensureThatArg(container, is(not(nullValue())));
-        this.container = container;
-        autowireServicesAndContainer();
-    }
-
-    // /////////////////////////////////////////////////////////
     // Services
     // /////////////////////////////////////////////////////////
 
@@ -142,12 +121,9 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
 
     @Override
     public void injectServicesInto(final Object object) {
-        Assert.assertNotNull("no container", container);
         Assert.assertNotNull("no services", services);
 
-        final List<Object> servicesCopy = Lists.newArrayList(services);
-        servicesCopy.add(container);
-        injectServices(object, servicesCopy);
+        injectServices(object, Collections.unmodifiableList(services));
     }
 
     @Override
@@ -303,7 +279,6 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
     
     private void autowireServicesAndContainer() {
         injectServicesInto(this.services);
-        injectServicesInto(this.container);
     }
 
     @Override
@@ -326,13 +301,8 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
 
         List<Object> matchingServices = Lists.newArrayList();
         addAssignableTo(serviceClass, services, matchingServices);
-        addAssignableTo(serviceClass, singletonListFor(container), matchingServices);
-        
-        servicesByType.put(serviceClass, matchingServices);
-    }
 
-    private static List<Object> singletonListFor(Object obj) {
-        return obj!=null? Collections.singletonList(obj): Collections.emptyList();
+        servicesByType.put(serviceClass, matchingServices);
     }
 
     private static void addAssignableTo(Class<?> type, List<Object> candidates, List<Object> filteredServicesAndContainer) {

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 decae96..4a9d444 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
@@ -30,40 +30,13 @@ import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
  * The repository of services, also able to inject into any object.
  * 
  * <p>
- * The {@link #getContainer() domain object container} is always injected but is
- * not a {@link #getRegisteredServices() registered service}.
- * 
- * <p>
  * Can be considered a mutable SPI to the {@link ServicesInjector} immutable API.
  */
 public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injectable, ServicesInjector {
 
-    // ///////////////////////////////////////////////////////////////////////////
-    // Container
-    // ///////////////////////////////////////////////////////////////////////////
-
-    DomainObjectContainer getContainer();
-
-    /**
-     * Container to inject.
-     * 
-     * <p>
-     * This itself is injected.
-     */
-    public void setContainer(final DomainObjectContainer container);
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // Services
-    // ///////////////////////////////////////////////////////////////////////////
 
     /**
      * Services to be injected.
-     * 
-     * <p>
-     * Should automatically inject all services into each other (though calling
-     * {@link #open()} will also do this).
-     * 
-     * @param services
      */
     void setServices(List<Object> services);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerAware.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerAware.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerAware.java
deleted file mode 100644
index 58076d7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerAware.java
+++ /dev/null
@@ -1,28 +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.services.container;
-
-import org.apache.isis.applib.DomainObjectContainer;
-
-public interface DomainObjectContainerAware {
-
-    void setContainer(DomainObjectContainer container);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 e6c4f7c..cb5301a 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
@@ -26,6 +26,8 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import com.google.common.base.Predicate;
 import org.apache.isis.applib.*;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.query.Query;
@@ -53,6 +55,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
 
+@DomainService
 public class  DomainObjectContainerDefault implements DomainObjectContainer, QuerySubmitterAware, ObjectDirtierAware, DomainObjectServicesAware, ObjectPersistorAware, SpecificationLoaderAware, AuthenticationSessionProviderAware, AdapterManagerAware, LocalizationProviderAware, ExceptionRecognizer {
 
     private ObjectDirtier objectDirtier;
@@ -71,6 +74,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // titleOf
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public String titleOf(final Object domainObject) {
         final ObjectAdapter objectAdapter = adapterManager.adapterFor(domainObject);
@@ -86,6 +90,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // newInstance, disposeInstance
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     @SuppressWarnings("unchecked")
     public <T> T newTransientInstance(final Class<T> ofClass) {
@@ -98,6 +103,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         }
     }
 
+    @Programmatic
     @SuppressWarnings("unchecked")
     @Override
     public <T extends ViewModel> T newViewModelInstance(Class<T> ofClass, String memento) {
@@ -113,6 +119,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         }
     }
 
+    @Programmatic
     @Override
     @SuppressWarnings("unchecked")
     public <T> T newAggregatedInstance(final Object parent, final Class<T> ofClass) {
@@ -132,6 +139,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
      * Returns a new instance of the specified class that will have been
      * persisted.
      */
+    @Programmatic
     @Override
     public <T> T newPersistentInstance(final Class<T> ofClass) {
         final T newInstance = newTransientInstance(ofClass);
@@ -143,6 +151,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
      * Returns a new instance of the specified class that has the same persisted
      * state as the specified object.
      */
+    @Programmatic
     @Override
     public <T> T newInstance(final Class<T> ofClass, final Object object) {
         if (isPersistent(object)) {
@@ -168,6 +177,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return getDomainObjectServices().createAggregatedInstance(spec, parentAdapter);
     }
 
+    @Programmatic
     @Override
     public void remove(final Object persistentObject) {
         if (persistentObject == null) {
@@ -181,6 +191,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         getObjectPersistor().remove(adapter);
     }
 
+    @Programmatic
     @Override
     public void removeIfNotAlready(final Object object) {
         if (!isPersistent(object)) {
@@ -194,6 +205,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // injectServicesInto
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public <T> T injectServicesInto(T domainObject) {
         getDomainObjectServices().injectServicesInto(domainObject);
@@ -204,16 +216,19 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // resolve, objectChanged
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public void resolve(final Object parent) {
         getDomainObjectServices().resolve(parent);
     }
 
+    @Programmatic
     @Override
     public void resolve(final Object parent, final Object field) {
         getDomainObjectServices().resolve(parent, field);
     }
 
+    @Programmatic
     @Override
     public void objectChanged(final Object object) {
         getObjectDirtier().objectChanged(object);
@@ -223,11 +238,13 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // flush, commit
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public boolean flush() {
         return getDomainObjectServices().flush();
     }
 
+    @Programmatic
     @Override
     public void commit() {
         getDomainObjectServices().commit();
@@ -237,11 +254,13 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // isValid, validate
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public boolean isValid(final Object domainObject) {
         return validate(domainObject) == null;
     }
 
+    @Programmatic
     @Override
     public String validate(final Object domainObject) {
         final ObjectAdapter adapter = getAdapterManager().adapterFor(domainObject);
@@ -253,6 +272,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // persistence
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public boolean isPersistent(final Object domainObject) {
         final ObjectAdapter adapter = getAdapterManager().adapterFor(domainObject);
@@ -262,6 +282,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     /**
      * {@inheritDoc}
      */
+    @Programmatic
     @Override
     public void persist(final Object domainObject) {
         final ObjectAdapter adapter = getAdapterManager().adapterFor(domainObject);
@@ -282,6 +303,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     /**
      * {@inheritDoc}
      */
+    @Programmatic
     @Override
     public void persistIfNotAlready(final Object object) {
         if (isPersistent(object)) {
@@ -294,6 +316,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // security
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public UserMemento getUser() {
         final AuthenticationSession session = getAuthenticationSessionProvider().getAuthenticationSession();
@@ -305,7 +328,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return user;
     }
 
-    private List<RoleMemento> asRoleMementos(final List<String> roles) {
+    private static List<RoleMemento> asRoleMementos(final List<String> roles) {
         final List<RoleMemento> mementos = new ArrayList<RoleMemento>();
         if (roles != null) {
             for (final String role : roles) {
@@ -319,17 +342,20 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // properties
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public String getProperty(final String name) {
         return getDomainObjectServices().getProperty(name);
     }
 
+    @Programmatic
     @Override
     public String getProperty(final String name, final String defaultValue) {
         final String value = getProperty(name);
         return value == null ? defaultValue : value;
     }
 
+    @Programmatic
     @Override
     public List<String> getPropertyNames() {
         return getDomainObjectServices().getPropertyNames();
@@ -339,16 +365,19 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // info, warn, error messages
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public void informUser(final String message) {
         getDomainObjectServices().informUser(message);
     }
 
+    @Programmatic
     @Override
     public void raiseError(final String message) {
         getDomainObjectServices().raiseError(message);
     }
 
+    @Programmatic
     @Override
     public void warnUser(final String message) {
         getDomainObjectServices().warnUser(message);
@@ -358,6 +387,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // allInstances
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public <T> List<T> allInstances(final Class<T> type, long... range) {
         return allMatches(new QueryFindAllInstances<T>(type, range));
@@ -366,7 +396,8 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // //////////////////////////////////////////////////////////////////
     // allMatches
     // //////////////////////////////////////////////////////////////////
-    
+
+    @Programmatic
     @Override
     public <T> List<T> allMatches(final Class<T> cls, final Predicate<? super T> predicate, long... range) {
         final List<T> allInstances = allInstances(cls, range);
@@ -379,23 +410,27 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return filtered;
     }
 
+    @Programmatic
     @Deprecated
     @Override
     public <T> List<T> allMatches(final Class<T> cls, final Filter<? super T> filter, long... range) {
         return allMatches(cls, Filters.asPredicate(filter), range);
     }
-    
+
+    @Programmatic
     @Override
     public <T> List<T> allMatches(final Class<T> type, final T pattern, long... range) {
         Assert.assertTrue("pattern not compatible with type", type.isAssignableFrom(pattern.getClass()));
         return allMatches(new QueryFindByPattern<T>(type, pattern, range));
     }
 
+    @Programmatic
     @Override
     public <T> List<T> allMatches(final Class<T> type, final String title, long... range) {
         return allMatches(new QueryFindByTitle<T>(type, title, range));
     }
 
+    @Programmatic
     @Override
     public <T> List<T> allMatches(final Query<T> query) {
         flush(); // auto-flush any pending changes
@@ -407,6 +442,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // firstMatch
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public <T> T firstMatch(final Class<T> cls, final Predicate<T> predicate) {
         final List<T> allInstances = allInstances(cls); // Have to fetch all, as matching is done in next loop
@@ -418,24 +454,28 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return null;
     }
 
+    @Programmatic
     @Deprecated
     @Override
     public <T> T firstMatch(final Class<T> cls, final Filter<T> filter) {
         return firstMatch(cls, Filters.asPredicate(filter));
     }
-    
+
+    @Programmatic
     @Override
     public <T> T firstMatch(final Class<T> type, final T pattern) {
         final List<T> instances = allMatches(type, pattern, 0, 1); // No need to fetch more than 1
         return firstInstanceElseNull(instances);
     }
 
+    @Programmatic
     @Override
     public <T> T firstMatch(final Class<T> type, final String title) {
         final List<T> instances = allMatches(type, title, 0, 1); // No need to fetch more than 1
         return firstInstanceElseNull(instances);
     }
 
+    @Programmatic
     @Override
     @SuppressWarnings("unchecked")
     public <T> T firstMatch(final Query<T> query) {
@@ -448,6 +488,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     // uniqueMatch
     // //////////////////////////////////////////////////////////////////
 
+    @Programmatic
     @Override
     public <T> T uniqueMatch(final Class<T> type, final Predicate<T> predicate) {
         final List<T> instances = allMatches(type, predicate, 0, 2); // No need to fetch more than 2.
@@ -457,6 +498,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return firstInstanceElseNull(instances);
     }
 
+    @Programmatic
     @Deprecated
     @Override
     public <T> T uniqueMatch(final Class<T> type, final Filter<T> filter) {
@@ -466,7 +508,8 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         }
         return firstInstanceElseNull(instances);
     }
-    
+
+    @Programmatic
     @Override
     public <T> T uniqueMatch(final Class<T> type, final T pattern) {
         final List<T> instances = allMatches(type, pattern, 0, 2); // No need to fetch more than 2.
@@ -476,6 +519,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return firstInstanceElseNull(instances);
     }
 
+    @Programmatic
     @Override
     public <T> T uniqueMatch(final Class<T> type, final String title) {
         final List<T> instances = allMatches(type, title, 0, 2); // No need to fetch more than 2.
@@ -485,6 +529,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return firstInstanceElseNull(instances);
     }
 
+    @Programmatic
     @Override
     public <T> T uniqueMatch(final Query<T> query) {
         final List<T> instances = allMatches(query); // No need to fetch more than 2. 
@@ -494,7 +539,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return firstInstanceElseNull(instances);
     }
 
-    private <T> T firstInstanceElseNull(final List<T> instances) {
+    private static <T> T firstInstanceElseNull(final List<T> instances) {
         return instances.size() == 0 ? null : instances.get(0);
     }
 
@@ -514,17 +559,10 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         }
     }
 
-    // make not recognizable, instead show the error page...
-//    static class ExceptionRecognizerForObjectMemberAuthorizationException extends ExceptionRecognizerForType {
-//        public ExceptionRecognizerForObjectMemberAuthorizationException() {
-//            super(ObjectMember.AuthorizationException.class);
-//        }
-//    }
 
     private final ExceptionRecognizer recognizer =
             new ExceptionRecognizerComposite(
                     new ExceptionRecognizerForConcurrencyException(),
-//                    new ExceptionRecognizerForObjectMemberAuthorizationException(),
                     new ExceptionRecognizerForRecoverableException()
                 );
     
@@ -533,21 +571,25 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
      * which will automatically recognize any {@link org.apache.isis.applib.RecoverableException}s or
      * any {@link ConcurrencyException}s.
      */
+    @Programmatic
     @Override
     public String recognize(Throwable ex) {
         return recognizer.recognize(ex);
     }
-    
-    ExceptionRecognizer getRecognizer() {
-        return recognizer;
-    }
 
+
+    // //////////////////////////////////////////////////////////////////
+    // init, shutdown
+    // //////////////////////////////////////////////////////////////////
+
+    @Programmatic
     @PostConstruct
     @Override
     public void init(Map<String, String> properties) {
         recognizer.init(properties);
     }
 
+    @Programmatic
     @PreDestroy
     @Override
     public void shutdown() {
@@ -562,6 +604,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return querySubmitter;
     }
 
+    @Programmatic
     @Override
     public void setQuerySubmitter(final QuerySubmitter querySubmitter) {
         this.querySubmitter = querySubmitter;
@@ -571,6 +614,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return domainObjectServices;
     }
 
+    @Programmatic
     @Override
     public void setDomainObjectServices(final DomainObjectServices domainObjectServices) {
         this.domainObjectServices = domainObjectServices;
@@ -580,6 +624,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return specificationLookup;
     }
 
+    @Programmatic
     @Override
     public void setSpecificationLookup(final SpecificationLoader specificationLookup) {
         this.specificationLookup = specificationLookup;
@@ -589,6 +634,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return authenticationSessionProvider;
     }
 
+    @Programmatic
     @Override
     public void setAuthenticationSessionProvider(final AuthenticationSessionProvider authenticationSessionProvider) {
         this.authenticationSessionProvider = authenticationSessionProvider;
@@ -598,6 +644,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return adapterManager;
     }
 
+    @Programmatic
     @Override
     public void setAdapterManager(final AdapterManager adapterManager) {
         this.adapterManager = adapterManager;
@@ -607,6 +654,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return objectDirtier;
     }
 
+    @Programmatic
     @Override
     public void setObjectDirtier(final ObjectDirtier objectDirtier) {
         this.objectDirtier = objectDirtier;
@@ -616,6 +664,7 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
         return objectPersistor;
     }
 
+    @Programmatic
     @Override
     public void setObjectPersistor(final ObjectPersistor objectPersistor) {
         this.objectPersistor = objectPersistor;
@@ -627,6 +676,4 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     }
 
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/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 affc3e2..957ce93 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
@@ -30,20 +30,12 @@ import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 public interface SpecificationLoaderSpi extends ApplicationScopedComponent, DebuggableWithTitle, SpecificationLoader {
 
     /**
-     * Specify the {@link DomainObjectContainer} as part of initializing the services.
-     * 
-     * @see #setServices(List)
-     */
-    void setContainer(DomainObjectContainer container);
-    /**
      * Specify the services to pro-actively prime the cache, and to initialize them also.
-     * 
-     * @see #setContainer(DomainObjectContainer)
      */
     void setServices(List<Object> services);
 
     /**
-     * Populated as a result of running {@link MetaModelValidator#validate() validation} after all specs have been loaded. 
+     * Populated as a result of running metamodel validation after all specs have been loaded.
      * @param validationFailures 
      */
     void validateSpecifications(ValidationFailures validationFailures);

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index 3d2400e..78a9013 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -154,10 +154,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     private final SpecificationTraverser specificationTraverser;
 
     /**
-     * @see #setContainer(DomainObjectContainer)
-     */
-    private DomainObjectContainer container;
-    /**
      * @see #setServices(List)
      */
     private List<Object> services;
@@ -679,11 +675,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     }
     
     @Override
-    public void setContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-    
-    @Override
     public void setServices(final List<Object> services) {
         this.services = services;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
index b857f4c..c525047 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
@@ -19,16 +19,10 @@
 
 package org.apache.isis.core.metamodel.app;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
-import org.junit.Test;
-
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.unittestsupport.jmocking.IsisActions;
@@ -69,10 +63,4 @@ public class IsisMetaModelTest_getDomainObjectContainer {
         });
     }
 
-
-    @Test
-    public void happyCase() {
-        assertThat(metaModel.getDomainObjectContainer(), is(notNullValue()));
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
index b3f53b5..b8bd5ed 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
@@ -20,17 +20,13 @@
 package org.apache.isis.core.metamodel.app;
 
 import java.util.TreeSet;
-
 import com.google.common.collect.Lists;
-
 import org.jmock.Expectations;
 import org.jmock.Sequence;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
@@ -74,9 +70,6 @@ public class IsisMetaModelTest_init {
                 allowing(mockRuntimeContext).injectInto(with(any(Object.class)));
                 will(IsisActions.injectInto());
                 
-                oneOf(mockRuntimeContext).setContainer(with(any(DomainObjectContainer.class)));
-                inSequence(initSequence);
-                
                 oneOf(mockProgrammingModelFacets).init();
                 inSequence(initSequence);
                 

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
index 729ae30..0c553b0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
@@ -129,11 +129,6 @@ public class ProgrammableReflector implements SpecificationLoaderSpi, Applicatio
     }
 
     @Override
-    public void setContainer(DomainObjectContainer container) {
-        throw new NotYetImplementedException();
-    }
-
-    @Override
     public void setServices(final List<Object> services) {
         throw new NotYetImplementedException();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
index 01a305f..9c0cb1c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
@@ -78,8 +78,7 @@ public class ServicesInjectorDefaultTest {
 
     @Test
     public void shouldInjectContainer() {
-        injector.setContainer(mockContainer);
-        final Object[] services = { mockService1, mockService2 };
+        final Object[] services = { mockContainer, mockService1, mockService2 };
         injector.setServices(Arrays.asList(services));
 
         context.checking(new Expectations() {

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
index 1657249..af6ca86 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
@@ -19,25 +19,19 @@
 
 package org.apache.isis.core.metamodel.services;
 
-import static org.hamcrest.CoreMatchers.*;
-import static org.junit.Assert.assertThat;
-
 import java.util.Arrays;
-
 import javax.inject.Inject;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 public class ServicesInjectorDefaultTest_usingFields {
 
     @Rule
@@ -92,15 +86,12 @@ public class ServicesInjectorDefaultTest_usingFields {
 
     @Test
     public void shouldInjectContainer() {
-        injector.setContainer(container);
-        injector.setServices(Arrays.asList(service1, service3, service2));
+        injector.setServices(Arrays.asList(container, service1, service3, service2));
 
-        injector.injectServicesInto(container);
         injector.injectServicesInto(service1);
         injector.injectServicesInto(service2);
         injector.injectServicesInto(service3);
         
-        assertThat(service1.getContainer(), is(container));
         assertThat(service1.getSomeDomainService2(), is((SomeDomainService2Abstract)service2));
         
         assertThat(service2.getSomeDomainService1(), is(service1));

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
index fddd993..c013d06 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
@@ -85,8 +85,7 @@ public abstract class ObjectReflectorDefaultTestAbstract {
                         new HashSet<FacetDecorator>(),
                         new MetaModelValidatorDefault());
         reflector.setRuntimeContext(runtimeContext);
-        reflector.setContainer(new DomainObjectContainerDefault());
-        reflector.setServices(Collections.emptyList());
+        reflector.setServices(Collections.<Object>singletonList(new DomainObjectContainerDefault()));
         reflector.init();
         
         specification = loadSpecification(reflector);

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceConstants.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceConstants.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceConstants.java
index d83327d..e8e194c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceConstants.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceConstants.java
@@ -19,10 +19,6 @@
 
 package org.apache.isis.core.runtime.persistence;
 
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.runtime.system.persistence.ObjectFactory;
 
@@ -46,12 +42,6 @@ public final class PersistenceConstants {
      */
     public static final String CLASS_SUBSTITUTOR_CLASS_NAME_DEFAULT = "org.apache.isis.core.bytecode.cglib.CglibClassSubstitutor";
 
-    /**
-     * Key used to lookup implementation of {@link DomainObjectContainer} in
-     * {@link IsisConfiguration}.
-     */
-    public static final String DOMAIN_OBJECT_CONTAINER_CLASS_NAME = ConfigurationConstants.ROOT + "persistor.domain-object-container";
-    public static final String DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT = DomainObjectContainerDefault.class.getName();
 
     private PersistenceConstants() {
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
index 741f369..0c01e96 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
@@ -19,15 +19,7 @@
 
 package org.apache.isis.core.runtime.persistence;
 
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
-
 import java.util.List;
-
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -46,6 +38,9 @@ import org.apache.isis.core.runtime.system.persistence.ObjectFactory;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
+import static org.hamcrest.CoreMatchers.*;
+
 /**
  * Implementation that just delegates to a supplied
  * {@link PersistenceSessionFactory}.
@@ -57,10 +52,6 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     private final PersistenceSessionFactoryDelegate persistenceSessionFactoryDelegate;
 
     /**
-     * @see #setContainer(DomainObjectContainer)
-     */
-    private DomainObjectContainer container;
-    /**
      * @see #setServices(List)
      */
     private List<Object> serviceList;
@@ -101,7 +92,6 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     public final void init() {
 
         // check prereq dependencies injected
-        ensureThatState(container, is(not(nullValue())));
         ensureThatState(serviceList, is(notNullValue()));
 
         // a bit of a workaround, but required if anything in the metamodel (for
@@ -136,13 +126,10 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
         // wire up components
 
         getSpecificationLoader().injectInto(runtimeContext);
-        runtimeContext.injectInto(container);
-        runtimeContext.setContainer(container);
         for (Object service : serviceList) {
             runtimeContext.injectInto(service);
         }
 
-        servicesInjector.setContainer(container);
         servicesInjector.setServices(serviceList);
         servicesInjector.init();
     }
@@ -235,10 +222,6 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     // Dependencies (injected via setters)
     // //////////////////////////////////////////////////////
 
-    public void setContainer(DomainObjectContainer container) {
-        this.container = container;
-    }
-
     @Override
     public void setServices(final List<Object> serviceList) {
         this.serviceList = serviceList;

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
index e706692..5bd15a2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
@@ -51,7 +51,12 @@ public class ServicesInstallerFromAnnotation extends InstallerAbstract implement
      *
      * <p>
      * It's important that any services annotated {@link org.apache.isis.applib.annotation.DomainService} and residing
-     * in any of these packages must have no side-effects and must have only one implementation.
+     * in any of these packages must have no side-effects.
+     *
+     * <p>
+     *     Services are ordered according to the {@link org.apache.isis.applib.annotation.DomainService#menuOrder() menuOrder},
+     *     with the first service found used.
+     * </p>
      */
     public final static String PACKAGE_PREFIX_STANDARD =
                                          ",org.apache.isis.applib" +

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
index 2f6be7b..3d98d22 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
@@ -24,12 +24,10 @@ import java.util.Collection;
 import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
-import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
@@ -41,7 +39,6 @@ import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authentication.exploration.ExplorationSession;
 import org.apache.isis.core.runtime.authorization.AuthorizationManager;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
-import org.apache.isis.core.runtime.persistence.PersistenceConstants;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.internal.InitialisationSession;
 import org.apache.isis.core.runtime.system.internal.IsisLocaleInitializer;
@@ -143,12 +140,10 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
      */
     private ServiceInitializer initializeServices() {
 
-        final DomainObjectContainer container = sessionFactory.getContainer();
         final List<Object> services = sessionFactory.getServices();
         
         // autowire
         final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault();
-        servicesInjector.setContainer(container);
         servicesInjector.setServices(services);
         servicesInjector.init();
 
@@ -315,28 +310,9 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
     protected abstract AuthorizationManager obtainAuthorizationManager(final DeploymentType deploymentType);
 
     // ///////////////////////////////////////////
-    // Container & Services
+    // Services
     // ///////////////////////////////////////////
 
-    /**
-     * Returns a {@link DomainObjectContainer} as {@link #getConfiguration() configured}.
-     * 
-     * <p>
-    * By default, looks up implementation from provided
-    * {@link IsisConfiguration} using
-    * {@link PersistenceConstants#DOMAIN_OBJECT_CONTAINER_CLASS_NAME}. If no
-    * implementation is specified, then defaults to
-    * {@link PersistenceConstants#DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT}.
-     */
-    protected DomainObjectContainer obtainContainer() {
-        return createContainer(getConfiguration());
-    }
-
-    private DomainObjectContainer createContainer(final IsisConfiguration configuration) {
-        final String configuredClassName = configuration.getString(PersistenceConstants.DOMAIN_OBJECT_CONTAINER_CLASS_NAME, PersistenceConstants.DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT);
-        return InstanceUtil.createInstance(configuredClassName, PersistenceConstants.DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT, DomainObjectContainer.class);
-    }
-
     protected abstract List<Object> obtainServices();
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
index 7055e4c..65b6020 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
@@ -20,8 +20,6 @@
 package org.apache.isis.core.runtime.system.persistence;
 
 import java.util.List;
-
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
 import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
@@ -62,10 +60,9 @@ public interface PersistenceSessionFactory extends ClassSubstitutorFactory, Meta
     PersistenceSession createPersistenceSession();
 
     // //////////////////////////////////////////////////////
-    // Container & Services
+    // Services
     // //////////////////////////////////////////////////////
 
-    public void setContainer(DomainObjectContainer container);
     public void setServices(List<Object> servicesList);
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/98635d37/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
index 696b2d6..62704da 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
@@ -85,7 +85,6 @@ public interface IsisSessionFactory extends ApplicationScopedComponent {
      */
     public PersistenceSessionFactory getPersistenceSessionFactory();
 
-    public DomainObjectContainer getContainer();
     public List<Object> getServices();
 
     /**