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 2013/05/20 13:34:46 UTC

[6/8] ISIS-409: fixing up build post moving wrapper service to core

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/DomainObjectInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/DomainObjectInvocationHandler.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/DomainObjectInvocationHandler.java
deleted file mode 100644
index 66ce9eb..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/DomainObjectInvocationHandler.java
+++ /dev/null
@@ -1,645 +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.progmodel.wrapper.metamodel.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.events.CollectionAccessEvent;
-import org.apache.isis.applib.events.InteractionEvent;
-import org.apache.isis.applib.events.ObjectTitleEvent;
-import org.apache.isis.applib.events.PropertyAccessEvent;
-import org.apache.isis.applib.events.UsabilityEvent;
-import org.apache.isis.applib.events.ValidityEvent;
-import org.apache.isis.applib.events.VisibilityEvent;
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.applib.services.wrapper.DisabledException;
-import org.apache.isis.applib.services.wrapper.HiddenException;
-import org.apache.isis.applib.services.wrapper.InteractionException;
-import org.apache.isis.applib.services.wrapper.InvalidException;
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.services.wrapper.WrapperObject;
-import org.apache.isis.applib.services.wrapper.WrapperFactory.ExecutionMode;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistor;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.actions.choices.ActionChoicesFacet;
-import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
-import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacet;
-import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet;
-import org.apache.isis.core.metamodel.facets.properties.modify.PropertyInitializationFacet;
-import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
-import org.apache.isis.core.progmodel.facets.actions.validate.method.ActionValidationFacetViaMethod;
-import org.apache.isis.core.progmodel.facets.collections.validate.CollectionValidateAddToFacetViaMethod;
-import org.apache.isis.core.progmodel.facets.collections.validate.CollectionValidateRemoveFromFacetViaMethod;
-import org.apache.isis.core.progmodel.facets.members.disabled.method.DisableForContextFacetViaMethod;
-import org.apache.isis.core.progmodel.facets.members.hidden.method.HideForContextFacetViaMethod;
-import org.apache.isis.core.progmodel.facets.properties.modify.PropertyClearFacetViaClearMethod;
-import org.apache.isis.core.progmodel.facets.properties.modify.PropertySetterFacetViaModifyMethod;
-import org.apache.isis.core.progmodel.facets.properties.validate.PropertyValidateFacetViaMethod;
-
-public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandlerDefault<T> {
-
-    private final Map<Method, Collection<?>> collectionViewObjectsByMethod = new HashMap<Method, Collection<?>>();
-    private final Map<Method, Map<?, ?>> mapViewObjectsByMethod = new HashMap<Method, Map<?, ?>>();
-
-    private final AuthenticationSessionProvider authenticationSessionProvider;
-    private final SpecificationLoader specificationLookup;
-    private final AdapterManager adapterManager;
-    private final ObjectPersistor objectPersistor;
-
-    /**
-     * The <tt>title()</tt> method; may be <tt>null</tt>.
-     */
-    protected Method titleMethod;
-
-    /**
-     * The <tt>save()</tt> method from {@link WrapperObject#save()}.
-     */
-    protected Method saveMethod;
-
-    /**
-     * The <tt>underlying()</tt> method from {@link WrapperObject#wrapped()}.
-     */
-    protected Method wrappedMethod;
-
-    public DomainObjectInvocationHandler(final T delegate, final WrapperFactory embeddedViewer, final ExecutionMode mode, final AuthenticationSessionProvider authenticationSessionProvider, final SpecificationLoader specificationLookup, final AdapterManager adapterManager,
-            final ObjectPersistor objectPersistor) {
-        super(delegate, embeddedViewer, mode);
-
-        this.authenticationSessionProvider = authenticationSessionProvider;
-        this.specificationLookup = specificationLookup;
-        this.adapterManager = adapterManager;
-        this.objectPersistor = objectPersistor;
-
-        try {
-            titleMethod = delegate.getClass().getMethod("title", new Class[] {});
-            saveMethod = WrapperObject.class.getMethod("save", new Class[] {});
-            wrappedMethod = WrapperObject.class.getMethod("wrapped", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-        }
-    }
-
-    @Override
-    public Object invoke(final Object proxyObject, final Method method, final Object[] args) throws Throwable {
-
-        if (isObjectMethod(method)) {
-            return delegate(method, args);
-        }
-
-        final ObjectAdapter targetAdapter = getAdapterManager().getAdapterFor(getDelegate());
-
-        if (isTitleMethod(method)) {
-            return handleTitleMethod(method, args, targetAdapter);
-        }
-
-        final ObjectSpecification targetNoSpec = targetAdapter.getSpecification();
-
-        // save method, through the proxy
-        if (isSaveMethod(method)) {
-            return handleSaveMethod(getAuthenticationSession(), targetAdapter, targetNoSpec);
-        }
-
-        if (isUnderlyingMethod(method)) {
-            return getDelegate();
-        }
-
-        final ObjectMember objectMember = locateAndCheckMember(method);
-        final List<Facet> imperativeFacets = getImperativeFacets(objectMember, method);
-
-        final String memberName = objectMember.getName();
-
-        if (instanceOf(imperativeFacets, DisableForContextFacetViaMethod.class, HideForContextFacetViaMethod.class)) {
-            throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'", memberName));
-        }
-
-        final String methodName = method.getName();
-
-        if (instanceOf(imperativeFacets, ActionDefaultsFacet.class, PropertyDefaultFacet.class, ActionChoicesFacet.class, ActionParameterChoicesFacet.class, PropertyChoicesFacet.class)) {
-            return method.invoke(getDelegate(), args);
-        }
-
-        // for all members, check visibility and usability
-        checkVisibility(getAuthenticationSession(), targetAdapter, objectMember);
-
-        if (objectMember.isOneToOneAssociation()) {
-
-            if (instanceOf(imperativeFacets, PropertyValidateFacetViaMethod.class, PropertySetterFacetViaModifyMethod.class, PropertyClearFacetViaClearMethod.class)) {
-                throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only property accessor/mutator", memberName));
-            }
-
-            final OneToOneAssociation otoa = (OneToOneAssociation) objectMember;
-            if (instanceOf(imperativeFacets, PropertyOrCollectionAccessorFacet.class)) {
-                return handleGetterMethodOnProperty(args, targetAdapter, otoa, methodName);
-            }
-            if (instanceOf(imperativeFacets, PropertySetterFacet.class, PropertyInitializationFacet.class)) {
-                checkUsability(getAuthenticationSession(), targetAdapter, objectMember);
-                return handleSetterMethodOnProperty(args, getAuthenticationSession(), targetAdapter, otoa, methodName);
-            }
-        }
-        if (objectMember.isOneToManyAssociation()) {
-
-            if (instanceOf(imperativeFacets, CollectionValidateAddToFacetViaMethod.class, CollectionValidateRemoveFromFacetViaMethod.class)) {
-                throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only collection accessor/mutator", memberName));
-            }
-
-            final OneToManyAssociation otma = (OneToManyAssociation) objectMember;
-            if (instanceOf(imperativeFacets, PropertyOrCollectionAccessorFacet.class)) {
-                return handleGetterMethodOnCollection(method, args, targetAdapter, otma, memberName);
-            }
-            if (instanceOf(imperativeFacets, CollectionAddToFacet.class)) {
-                checkUsability(getAuthenticationSession(), targetAdapter, objectMember);
-                return handleCollectionAddToMethod(args, targetAdapter, otma, methodName);
-            }
-            if (instanceOf(imperativeFacets, CollectionRemoveFromFacet.class)) {
-                checkUsability(getAuthenticationSession(), targetAdapter, objectMember);
-                return handleCollectionRemoveFromMethod(args, targetAdapter, otma, methodName);
-            }
-        }
-
-        // filter out
-        if (instanceOf(imperativeFacets, PropertyOrCollectionAccessorFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke accessor on properties or collections; '%s' represents %s", methodName, decode(objectMember)));
-        }
-        if (instanceOf(imperativeFacets, PropertySetterFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke mutator on properties; '%s' represents %s", methodName, decode(objectMember)));
-        }
-        if (instanceOf(imperativeFacets, CollectionAddToFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke 'adder' on collections; '%s' represents %s", methodName, decode(objectMember)));
-        }
-        if (instanceOf(imperativeFacets, CollectionRemoveFromFacet.class)) {
-            throw new UnsupportedOperationException(String.format("Can only invoke 'remover' on collections; '%s' represents %s", methodName, decode(objectMember)));
-        }
-
-        if (objectMember instanceof ObjectAction) {
-
-            if (instanceOf(imperativeFacets, ActionValidationFacetViaMethod.class)) {
-                throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only the 'invoke' method", memberName));
-            }
-
-            checkUsability(getAuthenticationSession(), targetAdapter, objectMember);
-
-            final ObjectAction noa = (ObjectAction) objectMember;
-            return handleActionMethod(args, getAuthenticationSession(), targetAdapter, noa, memberName);
-        }
-
-        throw new UnsupportedOperationException(String.format("Unknown member type '%s'", objectMember));
-    }
-
-    public List<Facet> getImperativeFacets(final ObjectMember objectMember, final Method method) {
-        final List<Facet> imperativeFacets = objectMember.getFacets(new Filter<Facet>() {
-            @Override
-            public boolean accept(final Facet facet) {
-                final ImperativeFacet imperativeFacet = asImperativeFacet(facet);
-                if (imperativeFacet == null) {
-                    return false;
-                }
-                return imperativeFacet.getMethods().contains(method);
-            }
-
-            private ImperativeFacet asImperativeFacet(final Facet facet) {
-                if (facet == null) {
-                    return null;
-                }
-                if (facet instanceof ImperativeFacet) {
-                    return (ImperativeFacet) facet;
-                }
-                return asImperativeFacet(facet.getUnderlyingFacet());
-            }
-        });
-
-        // there will be at least one
-        if (imperativeFacets.isEmpty()) {
-            throw new IllegalStateException("should be at least one imperative facet");
-        }
-        return imperativeFacets;
-    }
-
-    private static boolean instanceOf(final List<?> objects, final Class<?>... superTypes) {
-        for (final Class<?> superType : superTypes) {
-            for (final Object obj : objects) {
-                if (superType.isAssignableFrom(obj.getClass())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // title
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleTitleMethod(final Method method, final Object[] args, final ObjectAdapter targetAdapter) throws IllegalAccessException, InvocationTargetException {
-
-        resolveIfRequired(targetAdapter);
-
-        final ObjectSpecification targetNoSpec = targetAdapter.getSpecification();
-        final ObjectTitleContext titleContext = targetNoSpec.createTitleInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER, targetAdapter);
-        final ObjectTitleEvent titleEvent = titleContext.createInteractionEvent();
-        notifyListeners(titleEvent);
-        return titleEvent.getTitle();
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // save
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleSaveMethod(final AuthenticationSession session, final ObjectAdapter targetAdapter, final ObjectSpecification targetNoSpec) {
-
-        final InteractionResult interactionResult = targetNoSpec.isValidResult(targetAdapter);
-        notifyListenersAndVetoIfRequired(interactionResult);
-
-        if (getExecutionMode() == ExecutionMode.EXECUTE) {
-            if (targetAdapter.isTransient()) {
-                getObjectPersistor().makePersistent(targetAdapter);
-            }
-        }
-        return null;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // property - access
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleGetterMethodOnProperty(final Object[] args, final ObjectAdapter targetAdapter, final OneToOneAssociation otoa, final String methodName) {
-        if (args.length != 0) {
-            throw new IllegalArgumentException("Invoking a 'get' should have no arguments");
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final ObjectAdapter currentReferencedAdapter = otoa.get(targetAdapter);
-        final Object currentReferencedObj = AdapterUtils.unwrap(currentReferencedAdapter);
-
-        final PropertyAccessEvent ev = new PropertyAccessEvent(getDelegate(), otoa.getIdentifier(), currentReferencedObj);
-        notifyListeners(ev);
-        return currentReferencedObj;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // property - modify
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleSetterMethodOnProperty(final Object[] args, final AuthenticationSession session, final ObjectAdapter targetAdapter, final OneToOneAssociation otoa, final String methodName) {
-        if (args.length != 1) {
-            throw new IllegalArgumentException("Invoking a setter should only have a single argument");
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final Object argumentObj = underlying(args[0]);
-        final ObjectAdapter argumentAdapter = argumentObj != null ? getAdapterManager().adapterFor(argumentObj) : null;
-
-        final InteractionResult interactionResult = otoa.isAssociationValid(targetAdapter, argumentAdapter).getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-
-        if (getExecutionMode() == ExecutionMode.EXECUTE) {
-            otoa.set(targetAdapter, argumentAdapter);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // collection - access
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleGetterMethodOnCollection(final Method method, final Object[] args, final ObjectAdapter targetAdapter, final OneToManyAssociation otma, final String memberName) {
-        if (args.length != 0) {
-            throw new IllegalArgumentException("Invoking a 'get' should have no arguments");
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final ObjectAdapter currentReferencedAdapter = otma.get(targetAdapter);
-        final Object currentReferencedObj = AdapterUtils.unwrap(currentReferencedAdapter);
-
-        final CollectionAccessEvent ev = new CollectionAccessEvent(getDelegate(), otma.getIdentifier());
-
-        if (currentReferencedObj instanceof Collection) {
-            final Collection<?> collectionViewObject = lookupViewObject(method, memberName, (Collection<?>) currentReferencedObj, otma);
-            notifyListeners(ev);
-            return collectionViewObject;
-        } else if (currentReferencedObj instanceof Map) {
-            final Map<?, ?> mapViewObject = lookupViewObject(method, memberName, (Map<?, ?>) currentReferencedObj, otma);
-            notifyListeners(ev);
-            return mapViewObject;
-        }
-        throw new IllegalArgumentException(String.format("Collection type '%s' not supported by framework", currentReferencedObj.getClass().getName()));
-    }
-
-    /**
-     * Looks up (or creates) a proxy for this object.
-     */
-    private Collection<?> lookupViewObject(final Method method, final String memberName, final Collection<?> collectionToLookup, final OneToManyAssociation otma) {
-        Collection<?> collectionViewObject = collectionViewObjectsByMethod.get(method);
-        if (collectionViewObject == null) {
-            if (collectionToLookup instanceof WrapperObject) {
-                collectionViewObject = collectionToLookup;
-            } else {
-                collectionViewObject = Proxy.proxy(collectionToLookup, memberName, this, otma);
-            }
-            collectionViewObjectsByMethod.put(method, collectionViewObject);
-        }
-        return collectionViewObject;
-    }
-
-    private Map<?, ?> lookupViewObject(final Method method, final String memberName, final Map<?, ?> mapToLookup, final OneToManyAssociation otma) {
-        Map<?, ?> mapViewObject = mapViewObjectsByMethod.get(method);
-        if (mapViewObject == null) {
-            if (mapToLookup instanceof WrapperObject) {
-                mapViewObject = mapToLookup;
-            } else {
-                mapViewObject = Proxy.proxy(mapToLookup, memberName, this, otma);
-            }
-            mapViewObjectsByMethod.put(method, mapViewObject);
-        }
-        return mapViewObject;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // collection - add to
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleCollectionAddToMethod(final Object[] args, final ObjectAdapter targetAdapter, final OneToManyAssociation otma, final String methodName) {
-
-        if (args.length != 1) {
-            throw new IllegalArgumentException("Invoking a addTo should only have a single argument");
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final Object argumentObj = underlying(args[0]);
-        if (argumentObj == null) {
-            throw new IllegalArgumentException("Must provide a non-null object to add");
-        }
-        final ObjectAdapter argumentNO = getAdapterManager().adapterFor(argumentObj);
-
-        final InteractionResult interactionResult = otma.isValidToAdd(targetAdapter, argumentNO).getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-
-        if (getExecutionMode() == ExecutionMode.EXECUTE) {
-            otma.addElement(targetAdapter, argumentNO);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // collection - remove from
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleCollectionRemoveFromMethod(final Object[] args, final ObjectAdapter targetAdapter, final OneToManyAssociation otma, final String methodName) {
-        if (args.length != 1) {
-            throw new IllegalArgumentException("Invoking a removeFrom should only have a single argument");
-        }
-
-        resolveIfRequired(targetAdapter);
-
-        final Object argumentObj = underlying(args[0]);
-        if (argumentObj == null) {
-            throw new IllegalArgumentException("Must provide a non-null object to remove");
-        }
-        final ObjectAdapter argumentAdapter = getAdapterManager().adapterFor(argumentObj);
-
-        final InteractionResult interactionResult = otma.isValidToRemove(targetAdapter, argumentAdapter).getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-
-        if (getExecutionMode() == ExecutionMode.EXECUTE) {
-            otma.removeElement(targetAdapter, argumentAdapter);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // action
-    // /////////////////////////////////////////////////////////////////
-
-    private Object handleActionMethod(final Object[] args, final AuthenticationSession session, final ObjectAdapter targetAdapter, final ObjectAction noa, final String memberName) {
-
-        final Object[] underlyingArgs = new Object[args.length];
-        int i = 0;
-        for (final Object arg : args) {
-            underlyingArgs[i++] = underlying(arg);
-        }
-
-        final ObjectAdapter[] argAdapters = new ObjectAdapter[underlyingArgs.length];
-        int j = 0;
-        for (final Object underlyingArg : underlyingArgs) {
-            argAdapters[j++] = underlyingArg != null ? getAdapterManager().adapterFor(underlyingArg) : null;
-        }
-
-        final InteractionResult interactionResult = noa.isProposedArgumentSetValid(targetAdapter, argAdapters).getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-
-        if (getExecutionMode() == ExecutionMode.EXECUTE) {
-            final ObjectAdapter actionReturnNO = noa.execute(targetAdapter, argAdapters);
-            return AdapterUtils.unwrap(actionReturnNO);
-        }
-
-        objectChangedIfRequired(targetAdapter);
-
-        return null;
-    }
-
-    private Object underlying(final Object arg) {
-        if (arg instanceof WrapperObject) {
-            final WrapperObject argViewObject = (WrapperObject) arg;
-            return argViewObject.wrapped();
-        } else {
-            return arg;
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // visibility and usability checks (common to all members)
-    // /////////////////////////////////////////////////////////////////
-
-    /**
-     * REVIEW: ideally should provide some way to allow to caller to indicate the 'where' context.  Having
-     * a hard-coded value like this is an approximation. 
-     */
-    private final Where where = Where.ANYWHERE;
-
-    private void checkVisibility(final AuthenticationSession session, final ObjectAdapter targetObjectAdapter, final ObjectMember objectMember) {
-        final Consent visibleConsent = objectMember.isVisible(getAuthenticationSession(), targetObjectAdapter, where);
-        final InteractionResult interactionResult = visibleConsent.getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-    }
-
-    private void checkUsability(final AuthenticationSession session, final ObjectAdapter targetObjectAdapter, final ObjectMember objectMember) {
-        final InteractionResult interactionResult = objectMember.isUsable(getAuthenticationSession(), targetObjectAdapter, where).getInteractionResult();
-        notifyListenersAndVetoIfRequired(interactionResult);
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // notify listeners
-    // /////////////////////////////////////////////////////////////////
-
-    private void notifyListenersAndVetoIfRequired(final InteractionResult interactionResult) {
-        final InteractionEvent interactionEvent = interactionResult.getInteractionEvent();
-        notifyListeners(interactionEvent);
-        if (interactionEvent.isVeto()) {
-            throw toException(interactionEvent);
-        }
-    }
-
-    private String decode(final ObjectMember objectMember) {
-        if (objectMember instanceof OneToOneAssociation) {
-            return "a property";
-        }
-        if (objectMember instanceof OneToManyAssociation) {
-            return "a collection";
-        }
-        if (objectMember instanceof ObjectAction) {
-            return "an action";
-        }
-        return "an UNKNOWN member type";
-    }
-
-    /**
-     * Wraps a {@link InteractionEvent#isVeto() vetoing}
-     * {@link InteractionEvent} in a corresponding {@link InteractionException},
-     * and returns it.
-     */
-    private InteractionException toException(final InteractionEvent interactionEvent) {
-        if (!interactionEvent.isVeto()) {
-            throw new IllegalArgumentException("Provided interactionEvent must be a veto");
-        }
-        if (interactionEvent instanceof ValidityEvent) {
-            final ValidityEvent validityEvent = (ValidityEvent) interactionEvent;
-            return new InvalidException(validityEvent);
-        }
-        if (interactionEvent instanceof VisibilityEvent) {
-            final VisibilityEvent visibilityEvent = (VisibilityEvent) interactionEvent;
-            return new HiddenException(visibilityEvent);
-        }
-        if (interactionEvent instanceof UsabilityEvent) {
-            final UsabilityEvent usabilityEvent = (UsabilityEvent) interactionEvent;
-            return new DisabledException(usabilityEvent);
-        }
-        throw new IllegalArgumentException("Provided interactionEvent must be a VisibilityEvent, UsabilityEvent or a ValidityEvent");
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // switching
-    // /////////////////////////////////////////////////////////////////
-
-    private ObjectMember locateAndCheckMember(final Method method) {
-        final ObjectSpecificationDefault objectSpecificationDefault = getJavaSpecificationOfOwningClass(method);
-        final ObjectMember member = objectSpecificationDefault.getMember(method);
-        if (member == null) {
-            final String methodName = method.getName();
-            throw new UnsupportedOperationException("Method '" + methodName + "' being invoked does not correspond to any of the object's fields or actions.");
-        }
-        return member;
-    }
-
-    protected boolean isTitleMethod(final Method method) {
-        return method.equals(titleMethod);
-    }
-
-    protected boolean isSaveMethod(final Method method) {
-        return method.equals(saveMethod);
-    }
-
-    protected boolean isUnderlyingMethod(final Method method) {
-        return method.equals(wrappedMethod);
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // Specification lookup
-    // /////////////////////////////////////////////////////////////////
-
-    private ObjectSpecificationDefault getJavaSpecificationOfOwningClass(final Method method) {
-        return getJavaSpecification(method.getDeclaringClass());
-    }
-
-    private ObjectSpecificationDefault getJavaSpecification(final Class<?> clazz) {
-        final ObjectSpecification nos = getSpecification(clazz);
-        if (!(nos instanceof ObjectSpecificationDefault)) {
-            throw new UnsupportedOperationException("Only Java is supported (specification is '" + nos.getClass().getCanonicalName() + "')");
-        }
-        return (ObjectSpecificationDefault) nos;
-    }
-
-    private ObjectSpecification getSpecification(final Class<?> type) {
-        final ObjectSpecification nos = getSpecificationLookup().loadSpecification(type);
-        return nos;
-    }
-
-    // /////////////////////////////////////////////////////////////////
-    // Dependencies
-    // /////////////////////////////////////////////////////////////////
-
-    protected SpecificationLoader getSpecificationLookup() {
-        return specificationLookup;
-    }
-
-    public AuthenticationSessionProvider getAuthenticationSessionProvider() {
-        return authenticationSessionProvider;
-    }
-
-    protected AuthenticationSession getAuthenticationSession() {
-        return getAuthenticationSessionProvider().getAuthenticationSession();
-    }
-
-    protected AdapterManager getAdapterManager() {
-        return adapterManager;
-    }
-
-    protected ObjectPersistor getObjectPersistor() {
-        return objectPersistor;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IClassInstantiatorCE.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IClassInstantiatorCE.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IClassInstantiatorCE.java
deleted file mode 100644
index d551c72..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IClassInstantiatorCE.java
+++ /dev/null
@@ -1,37 +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.progmodel.wrapper.metamodel.internal;
-
-/**
- * Used to instantiate a given class.
- */
-interface IClassInstantiatorCE {
-
-    /**
-     * Return a new instance of the specified class. The recommended way is
-     * without calling any constructor. This is usually done by doing like
-     * <code>ObjectInputStream.readObject()</code> which is JVM specific.
-     * 
-     * @param c
-     *            Class to instantiate
-     * @return new instance of clazz
-     */
-    Object newInstance(Class<?> clazz) throws InstantiationException;
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IProxyFactory.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IProxyFactory.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IProxyFactory.java
deleted file mode 100644
index c92c0e8..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/IProxyFactory.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.progmodel.wrapper.metamodel.internal;
-
-import java.lang.reflect.InvocationHandler;
-
-public interface IProxyFactory<T> {
-    T createProxy(Class<T> toProxyClass, InvocationHandler handler);
-
-    T createProxy(T toProxy, InvocationHandler handler);
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcher.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcher.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcher.java
deleted file mode 100644
index 0515501..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcher.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.progmodel.wrapper.metamodel.internal;
-
-import org.apache.isis.applib.events.InteractionEvent;
-
-public interface InteractionEventDispatcher {
-
-    void dispatch(InteractionEvent interactionEvent);
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcherTypeSafe.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcherTypeSafe.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcherTypeSafe.java
deleted file mode 100644
index 5ae80f6..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InteractionEventDispatcherTypeSafe.java
+++ /dev/null
@@ -1,34 +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.progmodel.wrapper.metamodel.internal;
-
-import org.apache.isis.applib.events.InteractionEvent;
-
-public abstract class InteractionEventDispatcherTypeSafe<T extends InteractionEvent> implements InteractionEventDispatcher {
-
-    public abstract void dispatchTypeSafe(T interactionEvent);
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void dispatch(final InteractionEvent interactionEvent) {
-        dispatchTypeSafe((T) interactionEvent);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InvocationHandlerMethodInterceptor.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InvocationHandlerMethodInterceptor.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InvocationHandlerMethodInterceptor.java
deleted file mode 100644
index ebdcb52..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/InvocationHandlerMethodInterceptor.java
+++ /dev/null
@@ -1,39 +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.progmodel.wrapper.metamodel.internal;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-
-import net.sf.cglib.proxy.MethodInterceptor;
-import net.sf.cglib.proxy.MethodProxy;
-
-public class InvocationHandlerMethodInterceptor implements MethodInterceptor {
-    private final InvocationHandler handler;
-
-    InvocationHandlerMethodInterceptor(final InvocationHandler handler) {
-        this.handler = handler;
-    }
-
-    @Override
-    public Object intercept(final Object obj, final Method method, final Object[] args, final MethodProxy proxy) throws Throwable {
-        return handler.invoke(obj, method, args);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/JavaProxyFactory.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/JavaProxyFactory.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/JavaProxyFactory.java
deleted file mode 100644
index e67a31d..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/JavaProxyFactory.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.progmodel.wrapper.metamodel.internal;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
-
-import org.apache.isis.applib.services.wrapper.WrapperObject;
-
-public class JavaProxyFactory<T> implements IProxyFactory<T> {
-    @Override
-    @SuppressWarnings("unchecked")
-    public T createProxy(final T toProxy, final InvocationHandler handler) {
-        final Class<T> proxyClass = (Class<T>) toProxy.getClass();
-        return (T) Proxy.newProxyInstance(proxyClass.getClassLoader(), new Class[] { proxyClass }, handler);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public T createProxy(final Class<T> toProxy, final InvocationHandler handler) {
-        return (T) Proxy.newProxyInstance(toProxy.getClassLoader(), new Class[] { toProxy, WrapperObject.class }, handler);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/MapInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/MapInvocationHandler.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/MapInvocationHandler.java
deleted file mode 100644
index 779afac..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/MapInvocationHandler.java
+++ /dev/null
@@ -1,49 +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.progmodel.wrapper.metamodel.internal;
-
-import static org.apache.isis.core.commons.lang.MethodUtils.getMethod;
-
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-class MapInvocationHandler<T, C> extends AbstractCollectionInvocationHandler<T, C> {
-
-    public MapInvocationHandler(final C collectionToProxy, final String collectionName, final DomainObjectInvocationHandler<T> handler, final OneToManyAssociation otma) {
-        super(collectionToProxy, collectionName, handler, otma);
-
-        try {
-            intercept(getMethod(collectionToProxy, "containsKey", Object.class));
-            intercept(getMethod(collectionToProxy, "containsValue", Object.class));
-            intercept(getMethod(collectionToProxy, "size"));
-            intercept(getMethod(collectionToProxy, "isEmpty"));
-            veto(getMethod(collectionToProxy, "put", Object.class, Object.class));
-            veto(getMethod(collectionToProxy, "remove", Object.class));
-            veto(getMethod(collectionToProxy, "putAll", Map.class));
-            veto(getMethod(collectionToProxy, "clear"));
-        } catch (final NoSuchMethodException e) {
-            // ///CLOVER:OFF
-            throw new RuntimeException("A Collection method could not be found: " + e.getMessage());
-            // ///CLOVER:ON
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/ObjenesisClassInstantiatorCE.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/ObjenesisClassInstantiatorCE.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/ObjenesisClassInstantiatorCE.java
deleted file mode 100644
index 00028f1..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/ObjenesisClassInstantiatorCE.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.progmodel.wrapper.metamodel.internal;
-
-import org.objenesis.ObjenesisHelper;
-
-class ObjenesisClassInstantiatorCE implements IClassInstantiatorCE {
-
-    @Override
-    public Object newInstance(final Class<?> clazz) throws InstantiationException {
-        return ObjenesisHelper.newInstance(clazz);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/Proxy.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/Proxy.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/Proxy.java
deleted file mode 100644
index 5008c2f..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/Proxy.java
+++ /dev/null
@@ -1,80 +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.progmodel.wrapper.metamodel.internal;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.services.wrapper.WrapperFactory.ExecutionMode;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.commons.ensure.Ensure;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistor;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-public class Proxy {
-
-    public static <T> T proxy(final T domainObject, final WrapperFactory wrapperFactory, final ExecutionMode mode, final AuthenticationSessionProvider authenticationSessionProvider, final SpecificationLoader specificationLookup, final AdapterManager adapterManager, final ObjectPersistor objectPersistor) {
-
-        Ensure.ensureThatArg(wrapperFactory, is(not(nullValue())));
-        Ensure.ensureThatArg(authenticationSessionProvider, is(not(nullValue())));
-        Ensure.ensureThatArg(specificationLookup, is(not(nullValue())));
-        Ensure.ensureThatArg(adapterManager, is(not(nullValue())));
-        Ensure.ensureThatArg(objectPersistor, is(not(nullValue())));
-
-        final DomainObjectInvocationHandler<T> invocationHandler = new DomainObjectInvocationHandler<T>(domainObject, wrapperFactory, mode, authenticationSessionProvider, specificationLookup, adapterManager, objectPersistor);
-
-        final CgLibProxy<T> cglibProxy = new CgLibProxy<T>(invocationHandler);
-        return cglibProxy.proxy();
-    }
-
-    /**
-     * Whether to execute or not will be picked up from the supplied parent
-     * handler.
-     */
-    public static <T, E> Collection<E> proxy(final Collection<E> collectionToProxy, final String collectionName, final DomainObjectInvocationHandler<T> handler, final OneToManyAssociation otma) {
-
-        final CollectionInvocationHandler<T, Collection<E>> collectionInvocationHandler = new CollectionInvocationHandler<T, Collection<E>>(collectionToProxy, collectionName, handler, otma);
-        collectionInvocationHandler.setResolveObjectChangedEnabled(handler.isResolveObjectChangedEnabled());
-
-        final CgLibProxy<Collection<E>> cglibProxy = new CgLibProxy<Collection<E>>(collectionInvocationHandler);
-        return cglibProxy.proxy();
-    }
-
-    /**
-     * Whether to execute or not will be picked up from the supplied parent
-     * handler.
-     */
-    public static <T, P, Q> Map<P, Q> proxy(final Map<P, Q> collectionToProxy, final String collectionName, final DomainObjectInvocationHandler<T> handler, final OneToManyAssociation otma) {
-
-        final MapInvocationHandler<T, Map<P, Q>> mapInvocationHandler = new MapInvocationHandler<T, Map<P, Q>>(collectionToProxy, collectionName, handler, otma);
-        mapInvocationHandler.setResolveObjectChangedEnabled(handler.isResolveObjectChangedEnabled());
-
-        final CgLibProxy<Map<P, Q>> cglibProxy = new CgLibProxy<Map<P, Q>>(mapInvocationHandler);
-        return cglibProxy.proxy();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/RuntimeExceptionWrapper.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/RuntimeExceptionWrapper.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/RuntimeExceptionWrapper.java
deleted file mode 100644
index b6eae03..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/RuntimeExceptionWrapper.java
+++ /dev/null
@@ -1,33 +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.progmodel.wrapper.metamodel.internal;
-
-public class RuntimeExceptionWrapper extends RuntimeException {
-    private static final long serialVersionUID = 1L;
-    private final RuntimeException runtimeException;
-
-    public RuntimeExceptionWrapper(final RuntimeException runtimeException) {
-        this.runtimeException = runtimeException;
-    }
-
-    public RuntimeException getRuntimeException() {
-        return runtimeException;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/WrapperFactoryDefault.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/WrapperFactoryDefault.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/WrapperFactoryDefault.java
deleted file mode 100644
index 4a51a03..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/WrapperFactoryDefault.java
+++ /dev/null
@@ -1,271 +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.progmodel.wrapper.metamodel.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.applib.events.ActionArgumentEvent;
-import org.apache.isis.applib.events.ActionInvocationEvent;
-import org.apache.isis.applib.events.ActionUsabilityEvent;
-import org.apache.isis.applib.events.ActionVisibilityEvent;
-import org.apache.isis.applib.events.CollectionAccessEvent;
-import org.apache.isis.applib.events.CollectionAddToEvent;
-import org.apache.isis.applib.events.CollectionMethodEvent;
-import org.apache.isis.applib.events.CollectionRemoveFromEvent;
-import org.apache.isis.applib.events.CollectionUsabilityEvent;
-import org.apache.isis.applib.events.CollectionVisibilityEvent;
-import org.apache.isis.applib.events.InteractionEvent;
-import org.apache.isis.applib.events.ObjectTitleEvent;
-import org.apache.isis.applib.events.ObjectValidityEvent;
-import org.apache.isis.applib.events.PropertyAccessEvent;
-import org.apache.isis.applib.events.PropertyModifyEvent;
-import org.apache.isis.applib.events.PropertyUsabilityEvent;
-import org.apache.isis.applib.events.PropertyVisibilityEvent;
-import org.apache.isis.applib.services.wrapper.WrapperFactory;
-import org.apache.isis.applib.services.wrapper.WrapperObject;
-import org.apache.isis.applib.services.wrapper.listeners.InteractionListener;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProviderAware;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistor;
-import org.apache.isis.core.metamodel.adapter.ObjectPersistorAware;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
-
-public class WrapperFactoryDefault implements WrapperFactory, AuthenticationSessionProviderAware, SpecificationLoaderAware, AdapterManagerAware, ObjectPersistorAware {
-
-    private final List<InteractionListener> listeners = new ArrayList<InteractionListener>();
-    private final Map<Class<? extends InteractionEvent>, InteractionEventDispatcher> dispatchersByEventClass = new HashMap<Class<? extends InteractionEvent>, InteractionEventDispatcher>();
-
-    private AuthenticationSessionProvider authenticationSessionProvider;
-    private SpecificationLoader specificationLookup;
-    private AdapterManager adapterManager;
-    private ObjectPersistor objectPersistor;
-
-    public WrapperFactoryDefault() {
-        dispatchersByEventClass.put(ObjectTitleEvent.class, new InteractionEventDispatcherTypeSafe<ObjectTitleEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ObjectTitleEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.objectTitleRead(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyVisibilityEvent.class, new InteractionEventDispatcherTypeSafe<PropertyVisibilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyVisibilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyVisible(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyUsabilityEvent.class, new InteractionEventDispatcherTypeSafe<PropertyUsabilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyUsabilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyUsable(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyAccessEvent.class, new InteractionEventDispatcherTypeSafe<PropertyAccessEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyAccessEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyAccessed(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(PropertyModifyEvent.class, new InteractionEventDispatcherTypeSafe<PropertyModifyEvent>() {
-            @Override
-            public void dispatchTypeSafe(final PropertyModifyEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.propertyModified(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionVisibilityEvent.class, new InteractionEventDispatcherTypeSafe<CollectionVisibilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionVisibilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionVisible(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionUsabilityEvent.class, new InteractionEventDispatcherTypeSafe<CollectionUsabilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionUsabilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionUsable(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionAccessEvent.class, new InteractionEventDispatcherTypeSafe<CollectionAccessEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionAccessEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionAccessed(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionAddToEvent.class, new InteractionEventDispatcherTypeSafe<CollectionAddToEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionAddToEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionAddedTo(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionRemoveFromEvent.class, new InteractionEventDispatcherTypeSafe<CollectionRemoveFromEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionRemoveFromEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionRemovedFrom(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionVisibilityEvent.class, new InteractionEventDispatcherTypeSafe<ActionVisibilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionVisibilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionVisible(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionUsabilityEvent.class, new InteractionEventDispatcherTypeSafe<ActionUsabilityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionUsabilityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionUsable(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionArgumentEvent.class, new InteractionEventDispatcherTypeSafe<ActionArgumentEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionArgumentEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionArgument(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ActionInvocationEvent.class, new InteractionEventDispatcherTypeSafe<ActionInvocationEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ActionInvocationEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.actionInvoked(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(ObjectValidityEvent.class, new InteractionEventDispatcherTypeSafe<ObjectValidityEvent>() {
-            @Override
-            public void dispatchTypeSafe(final ObjectValidityEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.objectPersisted(interactionEvent);
-                }
-            }
-        });
-        dispatchersByEventClass.put(CollectionMethodEvent.class, new InteractionEventDispatcherTypeSafe<CollectionMethodEvent>() {
-            @Override
-            public void dispatchTypeSafe(final CollectionMethodEvent interactionEvent) {
-                for (final InteractionListener l : getListeners()) {
-                    l.collectionMethodInvoked(interactionEvent);
-                }
-            }
-        });
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Views
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public <T> T wrap(final T domainObject) {
-        return wrap(domainObject, ExecutionMode.EXECUTE);
-    }
-
-    @Override
-    public <T> T wrap(final T domainObject, final ExecutionMode mode) {
-        if (isWrapper(domainObject)) {
-            return domainObject;
-        }
-        return Proxy.proxy(domainObject, this, mode, authenticationSessionProvider, specificationLookup, adapterManager, objectPersistor);
-    }
-
-    @Override
-    public boolean isWrapper(final Object possibleWrapper) {
-        return possibleWrapper instanceof WrapperObject;
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Listeners
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public List<InteractionListener> getListeners() {
-        return listeners;
-    }
-
-    @Override
-    public boolean addInteractionListener(final InteractionListener listener) {
-        return listeners.add(listener);
-    }
-
-    @Override
-    public boolean removeInteractionListener(final InteractionListener listener) {
-        return listeners.remove(listener);
-    }
-
-    @Override
-    public void notifyListeners(final InteractionEvent interactionEvent) {
-        final InteractionEventDispatcher dispatcher = dispatchersByEventClass.get(interactionEvent.getClass());
-        if (dispatcher == null) {
-            throw new RuntimeException("Unknown InteractionEvent - register into dispatchers map");
-        }
-        dispatcher.dispatch(interactionEvent);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Listeners
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public void setAuthenticationSessionProvider(final AuthenticationSessionProvider authenticationSessionProvider) {
-        this.authenticationSessionProvider = authenticationSessionProvider;
-    }
-
-    @Override
-    public void setAdapterManager(final AdapterManager adapterManager) {
-        this.adapterManager = adapterManager;
-    }
-
-    @Override
-    public void setSpecificationLookup(final SpecificationLoader specificationLookup) {
-        this.specificationLookup = specificationLookup;
-    }
-
-    @Override
-    public void setObjectPersistor(final ObjectPersistor objectPersistor) {
-        this.objectPersistor = objectPersistor;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/Constants.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/Constants.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/Constants.java
deleted file mode 100644
index 2b743c5..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/Constants.java
+++ /dev/null
@@ -1,52 +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.progmodel.wrapper.metamodel.internal.util;
-
-public final class Constants {
-    private Constants() {
-    }
-
-    public static final String PREFIX_CHOICES = "choices";
-    public static final String PREFIX_DEFAULT = "default";
-    public static final String PREFIX_HIDE = "hide";
-    public static final String PREFIX_DISABLE = "disable";
-    public static final String PREFIX_VALIDATE_REMOVE_FROM = "validateRemoveFrom";
-    public static final String PREFIX_VALIDATE_ADD_TO = "validateAddTo";
-    public static final String PREFIX_VALIDATE = "validate";
-    public static final String PREFIX_REMOVE_FROM = "removeFrom";
-    public static final String PREFIX_ADD_TO = "addTo";
-    public static final String PREFIX_MODIFY = "modify";
-    public static final String PREFIX_CLEAR = "clear";
-    public static final String PREFIX_SET = "set";
-    public static final String PREFIX_GET = "get";
-
-    public final static String TITLE_METHOD_NAME = "title";
-    public final static String TO_STRING_METHOD_NAME = "toString";
-
-    /**
-     * Cannot invoke methods with these prefixes.
-     */
-    public final static String[] INVALID_PREFIXES = { PREFIX_MODIFY, PREFIX_CLEAR, PREFIX_DISABLE, PREFIX_VALIDATE, PREFIX_VALIDATE_ADD_TO, PREFIX_VALIDATE_REMOVE_FROM, PREFIX_HIDE, };
-
-    public final static String[] PROPERTY_PREFIXES = { PREFIX_GET, PREFIX_SET, PREFIX_MODIFY, PREFIX_CLEAR, PREFIX_DISABLE, PREFIX_VALIDATE, PREFIX_HIDE, PREFIX_DEFAULT, PREFIX_CHOICES };
-    public final static String[] COLLECTION_PREFIXES = { PREFIX_GET, PREFIX_SET, PREFIX_ADD_TO, PREFIX_REMOVE_FROM, PREFIX_DISABLE, PREFIX_VALIDATE_ADD_TO, PREFIX_VALIDATE_REMOVE_FROM, PREFIX_HIDE, PREFIX_DEFAULT, PREFIX_CHOICES };
-    public final static String[] ACTION_PREFIXES = { PREFIX_VALIDATE, PREFIX_DISABLE, PREFIX_HIDE, PREFIX_DEFAULT, PREFIX_CHOICES, };
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/MethodPrefixFinder.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/MethodPrefixFinder.java b/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/MethodPrefixFinder.java
deleted file mode 100644
index b2de21c..0000000
--- a/core/wrapper/src/main/java/org/apache/isis/progmodel/wrapper/metamodel/internal/util/MethodPrefixFinder.java
+++ /dev/null
@@ -1,48 +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.progmodel.wrapper.metamodel.internal.util;
-
-import java.util.Arrays;
-import java.util.LinkedHashSet;
-
-public final class MethodPrefixFinder {
-
-    // a Linked Hash Set is used to ensure that the ordering is preserved.
-    public final static LinkedHashSet<String> ALL_PREFIXES = new LinkedHashSet<String>() {
-        private static final long serialVersionUID = 1L;
-        {
-            // collection prefixes are added first because we want to
-            // test validateAddTo and validateRemoveFrom before validate
-            addAll(Arrays.asList(Constants.COLLECTION_PREFIXES));
-            addAll(Arrays.asList(Constants.PROPERTY_PREFIXES));
-            addAll(Arrays.asList(Constants.ACTION_PREFIXES));
-        }
-    };
-
-    public String findPrefix(final String methodName) {
-        for (final String prefix : ALL_PREFIXES) {
-            if (methodName.startsWith(prefix)) {
-                return prefix;
-            }
-        }
-        return "";
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject.java b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject.java
index e3f0dae..5a5c653 100644
--- a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject.java
+++ b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject.java
@@ -37,7 +37,7 @@ import org.apache.isis.core.tck.dom.claimapp.employees.EmployeeRepository;
 import org.apache.isis.core.tck.dom.claimapp.employees.EmployeeRepositoryImpl;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-import org.apache.isis.progmodel.wrapper.metamodel.internal.WrapperFactoryDefault;
+import org.apache.isis.core.wrapper.WrapperFactoryDefault;
 
 public class WrappedFactoryDefaultTest_wrappedObject {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject_transient.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject_transient.java b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject_transient.java
index 86b9173..0b11f09 100644
--- a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject_transient.java
+++ b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrappedFactoryDefaultTest_wrappedObject_transient.java
@@ -60,7 +60,7 @@ import org.apache.isis.core.runtime.authentication.standard.SimpleSession;
 import org.apache.isis.core.tck.dom.claimapp.employees.Employee;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-import org.apache.isis.progmodel.wrapper.metamodel.internal.WrapperFactoryDefault;
+import org.apache.isis.core.wrapper.WrapperFactoryDefault;
 
 public class WrappedFactoryDefaultTest_wrappedObject_transient {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/example/application/claims/viewer-dnd/src/test/java/org/apache/isis/example/claims/junit/AbstractTest.java
----------------------------------------------------------------------
diff --git a/example/application/claims/viewer-dnd/src/test/java/org/apache/isis/example/claims/junit/AbstractTest.java b/example/application/claims/viewer-dnd/src/test/java/org/apache/isis/example/claims/junit/AbstractTest.java
index 9455494..a1c6d38 100644
--- a/example/application/claims/viewer-dnd/src/test/java/org/apache/isis/example/claims/junit/AbstractTest.java
+++ b/example/application/claims/viewer-dnd/src/test/java/org/apache/isis/example/claims/junit/AbstractTest.java
@@ -26,6 +26,7 @@ import org.junit.runner.RunWith;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.wrapper.WrapperObject;
+import org.apache.isis.core.wrapper.WrapperFactoryDefault;
 import org.apache.isis.example.application.claims.dom.claim.ClaimRepository;
 import org.apache.isis.example.application.claims.dom.employee.Employee;
 import org.apache.isis.example.application.claims.dom.employee.EmployeeRepository;
@@ -34,7 +35,7 @@ import org.apache.isis.viewer.junit.Service;
 import org.apache.isis.viewer.junit.Services;
 
 @RunWith(IsisTestRunner.class)
-@Services({ @Service(ClaimRepository.class), @Service(EmployeeRepository.class) })
+@Services({ @Service(ClaimRepository.class), @Service(EmployeeRepository.class), @Service(WrapperFactoryDefault.class) })
 public abstract class AbstractTest {
 
     private DomainObjectContainer domainObjectContainer;

http://git-wip-us.apache.org/repos/asf/isis/blob/55f931ae/example/application/quickstart_dnd_junit_bdd/tests-junit/src/test/java/junit/AbstractTest.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_dnd_junit_bdd/tests-junit/src/test/java/junit/AbstractTest.java b/example/application/quickstart_dnd_junit_bdd/tests-junit/src/test/java/junit/AbstractTest.java
index b473cbe..e3ab772 100644
--- a/example/application/quickstart_dnd_junit_bdd/tests-junit/src/test/java/junit/AbstractTest.java
+++ b/example/application/quickstart_dnd_junit_bdd/tests-junit/src/test/java/junit/AbstractTest.java
@@ -28,6 +28,7 @@ import org.junit.runner.RunWith;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.wrapper.WrapperObject;
+import org.apache.isis.core.wrapper.WrapperFactoryDefault;
 import org.apache.isis.viewer.junit.ConfigDir;
 import org.apache.isis.viewer.junit.IsisTestRunner;
 import org.apache.isis.viewer.junit.Service;
@@ -35,7 +36,7 @@ import org.apache.isis.viewer.junit.Services;
 
 @RunWith(IsisTestRunner.class)
 @ConfigDir("../viewer-dnd/config") // acts as default, but can be overridden by annotations
-@Services({ @Service(ToDoItems.class) })
+@Services({ @Service(ToDoItems.class), @Service(WrapperFactoryDefault.class) })
 public abstract class AbstractTest {
 
     private DomainObjectContainer domainObjectContainer;