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

[10/12] isis git commit: ISIS-1213: renamed metamodel classes ("...Impl" to "...Default"); derive name of ObjectActionMixedIn from mixin type (if "_"); simplified logic of #getParameters; also...

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
new file mode 100644
index 0000000..69019aa
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -0,0 +1,298 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.specloader.specimpl;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.util.ToString;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.consent.InteractionResult;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
+import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
+import org.apache.isis.core.metamodel.interactions.CollectionUsabilityContext;
+import org.apache.isis.core.metamodel.interactions.CollectionVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+
+public class OneToManyAssociationDefault extends ObjectAssociationAbstract implements OneToManyAssociation {
+
+    public OneToManyAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
+                objectMemberDependencies);
+    }
+
+    protected OneToManyAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectSpecification objectSpec,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(facetedMethod, FeatureType.COLLECTION, objectSpec, objectMemberDependencies);
+    }
+
+    @Override
+    public CollectionSemantics getCollectionSemantics() {
+        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
+        return getCollectionTypeRegistry().semanticsOf(underlyingClass);
+    }
+
+    //region > visible, usable
+
+    @Override
+    public VisibilityContext<?> createVisibleInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new CollectionVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+
+    @Override
+    public UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new CollectionUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+    //endregion
+
+    //region > Validate Add
+    // Not API
+    private ValidityContext<?> createValidateAddInteractionContext(
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToAddAdapter) {
+        return new CollectionAddToContext(ownerAdapter, getIdentifier(), proposedToAddAdapter,
+                interactionInitiatedBy);
+    }
+
+    @Override
+    public Consent isValidToAdd(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToAddAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isValidToAddResult(ownerAdapter, proposedToAddAdapter, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResult isValidToAddResult(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToAddAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ValidityContext<?> validityContext = createValidateAddInteractionContext(
+                interactionInitiatedBy, ownerAdapter, proposedToAddAdapter);
+        return InteractionUtils.isValidResult(this, validityContext);
+    }
+
+    //endregion
+
+    //region > Validate Remove
+    private ValidityContext<?> createValidateRemoveInteractionContext(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToRemoveAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new CollectionRemoveFromContext(
+                ownerAdapter, getIdentifier(), proposedToRemoveAdapter, interactionInitiatedBy
+        );
+    }
+
+    @Override
+    public Consent isValidToRemove(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToRemoveAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isValidToRemoveResult(
+                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResult isValidToRemoveResult(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToRemoveAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ValidityContext<?> validityContext = createValidateRemoveInteractionContext(
+                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy);
+        return InteractionUtils.isValidResult(this, validityContext);
+    }
+
+    private boolean readWrite() {
+        return !isNotPersisted();
+    }
+
+    //endregion
+
+    //region > get, isEmpty, add, clear
+
+    @Override
+    public ObjectAdapter get(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final PropertyOrCollectionAccessorFacet accessor = getFacet(PropertyOrCollectionAccessorFacet.class);
+        final Object collection = accessor.getProperty(ownerAdapter,
+                interactionInitiatedBy);
+        if (collection == null) {
+            return null;
+        }
+        return getPersistenceSessionService().adapterFor(collection, ownerAdapter, this);
+    }
+
+    @Override
+    public boolean isEmpty(final ObjectAdapter parentAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
+        // REVIEW should we be able to determine if a collection is empty
+        // without loading it?
+        final ObjectAdapter collection = get(parentAdapter, interactionInitiatedBy);
+        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
+        return facet.size(collection) == 0;
+    }
+
+    //endregion
+
+    //region > add, clear
+
+    @Override
+    public void addElement(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter referencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if (referencedAdapter == null) {
+            throw new IllegalArgumentException("Can't use null to add an item to a collection");
+        }
+        if (readWrite()) {
+            if (ownerAdapter.representsPersistent() && referencedAdapter.isTransient()) {
+                throw new IsisException("can't set a reference to a transient object from a persistent one: " + ownerAdapter.titleString(null) + " (persistent) -> " + referencedAdapter.titleString() + " (transient)");
+            }
+            final CollectionAddToFacet facet = getFacet(CollectionAddToFacet.class);
+            facet.add(ownerAdapter, referencedAdapter, interactionInitiatedBy);
+        }
+    }
+
+    @Override
+    public void removeElement(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter referencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if (referencedAdapter == null) {
+            throw new IllegalArgumentException("element should not be null");
+        }
+        if (readWrite()) {
+            final CollectionRemoveFromFacet facet = getFacet(CollectionRemoveFromFacet.class);
+            facet.remove(ownerAdapter, referencedAdapter, interactionInitiatedBy);
+        }
+    }
+
+    public void removeAllAssociations(final ObjectAdapter ownerAdapter) {
+        final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
+        facet.clear(ownerAdapter);
+    }
+
+    @Override
+    public void clearCollection(final ObjectAdapter ownerAdapter) {
+        if (readWrite()) {
+            final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
+            facet.clear(ownerAdapter);
+        }
+    }
+
+    //endregion
+
+    //region > defaults
+    @Override
+    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
+        return null;
+    }
+
+    @Override
+    public void toDefault(final ObjectAdapter ownerAdapter) {
+    }
+
+    //endregion
+
+    //region > choices & autoComplete
+
+    @Override
+    public ObjectAdapter[] getChoices(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ObjectAdapter[0];
+    }
+
+    @Override
+    public boolean hasChoices() {
+        return false;
+    }
+
+    
+    @Override
+    public boolean hasAutoComplete() {
+        return false;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            ObjectAdapter object,
+            String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ObjectAdapter[0];
+    }
+    
+    @Override
+    public int getAutoCompleteMinLength() {
+        return 0; // n/a
+    }
+
+    //endregion
+
+    //region > debug, toString
+    @Override
+    public String debugData() {
+        final DebugString debugString = new DebugString();
+        debugString.indent();
+        debugString.indent();
+        getFacetedMethod().debugData(debugString);
+        return debugString.toString();
+    }
+
+    @Override
+    public String toString() {
+        final ToString str = new ToString(this);
+        str.append(super.toString());
+        str.append(",");
+        str.append("persisted", !isNotPersisted());
+        str.append("type", getSpecification() == null ? "unknown" : getSpecification().getShortIdentifier());
+        return str.toString();
+    }
+
+    //endregion
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
deleted file mode 100644
index fda40d2..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.specimpl;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.util.ToString;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
-import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
-import org.apache.isis.core.metamodel.interactions.CollectionUsabilityContext;
-import org.apache.isis.core.metamodel.interactions.CollectionVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-public class OneToManyAssociationImpl extends ObjectAssociationAbstract implements OneToManyAssociation {
-
-    public OneToManyAssociationImpl(
-            final FacetedMethod facetedMethod, 
-            final ObjectMemberDependencies objectMemberDependencies) {
-        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
-                objectMemberDependencies);
-    }
-
-    protected OneToManyAssociationImpl(
-            final FacetedMethod facetedMethod, 
-            final ObjectSpecification objectSpec, 
-            final ObjectMemberDependencies objectMemberDependencies) {
-        super(facetedMethod, FeatureType.COLLECTION, objectSpec, objectMemberDependencies);
-    }
-
-    @Override
-    public CollectionSemantics getCollectionSemantics() {
-        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return getCollectionTypeRegistry().semanticsOf(underlyingClass);
-    }
-
-    //region > visible, usable
-
-    @Override
-    public VisibilityContext<?> createVisibleInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new CollectionVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-
-    @Override
-    public UsabilityContext<?> createUsableInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new CollectionUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    //endregion
-
-    //region > Validate Add
-    // Not API
-    private ValidityContext<?> createValidateAddInteractionContext(
-            final InteractionInitiatedBy interactionInitiatedBy,
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToAddAdapter) {
-        return new CollectionAddToContext(ownerAdapter, getIdentifier(), proposedToAddAdapter,
-                interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isValidToAdd(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToAddAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isValidToAddResult(ownerAdapter, proposedToAddAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isValidToAddResult(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToAddAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext<?> validityContext = createValidateAddInteractionContext(
-                interactionInitiatedBy, ownerAdapter, proposedToAddAdapter);
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-    //endregion
-
-    //region > Validate Remove
-    private ValidityContext<?> createValidateRemoveInteractionContext(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new CollectionRemoveFromContext(
-                ownerAdapter, getIdentifier(), proposedToRemoveAdapter, interactionInitiatedBy
-        );
-    }
-
-    @Override
-    public Consent isValidToRemove(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isValidToRemoveResult(
-                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isValidToRemoveResult(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext<?> validityContext = createValidateRemoveInteractionContext(
-                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy);
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-    private boolean readWrite() {
-        return !isNotPersisted();
-    }
-
-    //endregion
-
-    //region > get, isEmpty, add, clear
-
-    @Override
-    public ObjectAdapter get(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final PropertyOrCollectionAccessorFacet accessor = getFacet(PropertyOrCollectionAccessorFacet.class);
-        final Object collection = accessor.getProperty(ownerAdapter,
-                interactionInitiatedBy);
-        if (collection == null) {
-            return null;
-        }
-        return getPersistenceSessionService().adapterFor(collection, ownerAdapter, this);
-    }
-
-    @Override
-    public boolean isEmpty(final ObjectAdapter parentAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        // REVIEW should we be able to determine if a collection is empty
-        // without loading it?
-        final ObjectAdapter collection = get(parentAdapter, interactionInitiatedBy);
-        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
-        return facet.size(collection) == 0;
-    }
-
-    //endregion
-
-    //region > add, clear
-
-    @Override
-    public void addElement(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter referencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (referencedAdapter == null) {
-            throw new IllegalArgumentException("Can't use null to add an item to a collection");
-        }
-        if (readWrite()) {
-            if (ownerAdapter.representsPersistent() && referencedAdapter.isTransient()) {
-                throw new IsisException("can't set a reference to a transient object from a persistent one: " + ownerAdapter.titleString(null) + " (persistent) -> " + referencedAdapter.titleString() + " (transient)");
-            }
-            final CollectionAddToFacet facet = getFacet(CollectionAddToFacet.class);
-            facet.add(ownerAdapter, referencedAdapter, interactionInitiatedBy);
-        }
-    }
-
-    @Override
-    public void removeElement(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter referencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (referencedAdapter == null) {
-            throw new IllegalArgumentException("element should not be null");
-        }
-        if (readWrite()) {
-            final CollectionRemoveFromFacet facet = getFacet(CollectionRemoveFromFacet.class);
-            facet.remove(ownerAdapter, referencedAdapter, interactionInitiatedBy);
-        }
-    }
-
-    public void removeAllAssociations(final ObjectAdapter ownerAdapter) {
-        final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
-        facet.clear(ownerAdapter);
-    }
-
-    @Override
-    public void clearCollection(final ObjectAdapter ownerAdapter) {
-        if (readWrite()) {
-            final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
-            facet.clear(ownerAdapter);
-        }
-    }
-
-    //endregion
-
-    //region > defaults
-    @Override
-    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
-        return null;
-    }
-
-    @Override
-    public void toDefault(final ObjectAdapter ownerAdapter) {
-    }
-
-    //endregion
-
-    //region > choices & autoComplete
-
-    @Override
-    public ObjectAdapter[] getChoices(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new ObjectAdapter[0];
-    }
-
-    @Override
-    public boolean hasChoices() {
-        return false;
-    }
-
-    
-    @Override
-    public boolean hasAutoComplete() {
-        return false;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            ObjectAdapter object,
-            String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new ObjectAdapter[0];
-    }
-    
-    @Override
-    public int getAutoCompleteMinLength() {
-        return 0; // n/a
-    }
-
-    //endregion
-
-    //region > debug, toString
-    @Override
-    public String debugData() {
-        final DebugString debugString = new DebugString();
-        debugString.indent();
-        debugString.indent();
-        getFacetedMethod().debugData(debugString);
-        return debugString.toString();
-    }
-
-    @Override
-    public String toString() {
-        final ToString str = new ToString(this);
-        str.append(super.toString());
-        str.append(",");
-        str.append("persisted", !isNotPersisted());
-        str.append("type", getSpecification() == null ? "unknown" : getSpecification().getShortIdentifier());
-        return str.toString();
-    }
-
-    //endregion
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index f387d1f..00f4c89 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -23,7 +23,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
-public class OneToOneActionParameterContributee extends OneToOneActionParameterImpl implements ObjectActionParameterContributee{
+public class OneToOneActionParameterContributee extends OneToOneActionParameterDefault implements ObjectActionParameterContributee{
 
     private final ObjectAdapter serviceAdapter;
     private final ObjectActionParameter serviceActionParameter;

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
new file mode 100644
index 0000000..65cf664
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
@@ -0,0 +1,35 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.facets.TypedHolder;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
+
+public class OneToOneActionParameterDefault extends ObjectActionParameterAbstract implements OneToOneActionParameter {
+
+    public OneToOneActionParameterDefault(
+            final int index,
+            final ObjectActionDefault actionImpl,
+            final TypedHolder peer) {
+        super(index, actionImpl, peer);
+    }
+
+
+}

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

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index d832cf8..1d4a7ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -22,7 +22,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
-public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl implements ObjectActionParameterMixedIn {
+public class OneToOneActionParameterMixedIn extends OneToOneActionParameterDefault implements ObjectActionParameterMixedIn {
 
     private final ObjectActionParameter mixinParameter;
     private final ObjectActionMixedIn mixedInAction;
@@ -56,4 +56,5 @@ public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl
     }
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
index 42997b9..61b0984 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
@@ -21,15 +21,12 @@ import java.util.List;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
@@ -42,7 +39,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
-public class OneToOneAssociationContributee extends OneToOneAssociationImpl implements ContributeeMember2 {
+public class OneToOneAssociationContributee extends OneToOneAssociationDefault implements ContributeeMember2 {
 
     private final Object servicePojo;
     private final ObjectAction serviceAction;
@@ -57,7 +54,7 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
 
     public OneToOneAssociationContributee(
             final Object servicePojo,
-            final ObjectActionImpl serviceAction,
+            final ObjectActionDefault serviceAction,
             final ObjectSpecification contributeeType,
             final ObjectMemberDependencies objectMemberDependencies) {
         super(serviceAction.getFacetedMethod(), serviceAction.getReturnType(), objectMemberDependencies);
@@ -145,62 +142,21 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
-    //region > FacetHolder
     @Override
-    public Class<? extends Facet>[] getFacetTypes() {
-        return facetHolder.getFacetTypes();
+    protected FacetHolder getFacetHolder() {
+        return facetHolder;
     }
 
-    @Override
-    public <T extends Facet> T getFacet(Class<T> cls) {
-        return facetHolder.getFacet(cls);
-    }
-
-    @Override
-    public boolean containsFacet(Class<? extends Facet> facetType) {
-        return facetHolder.containsFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
-        return facetHolder.containsDoOpFacet(facetType);
-    }
-
-    @Override
-    public List<Facet> getFacets(Filter<Facet> filter) {
-        return facetHolder.getFacets(filter);
-    }
-
-    @Override
-    public void addFacet(Facet facet) {
-        facetHolder.addFacet(facet);
-    }
-
-    @Override
-    public void addFacet(MultiTypedFacet facet) {
-        facetHolder.addFacet(facet);
-    }
-    
-    @Override
-    public void removeFacet(Facet facet) {
-        facetHolder.removeFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(Class<? extends Facet> facetType) {
-        facetHolder.removeFacet(facetType);
-    }
-
-    //endregion
-
     private ObjectAdapter getServiceAdapter() {
         return getPersistenceSessionService().adapterFor(servicePojo);
     }
 
+    //region > Contributee2 impl - getServiceContributedBy()
     @Override
     public ObjectSpecification getServiceContributedBy() {
         return getServiceAdapter().getSpecification();
     }
 
+    //endregion
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
new file mode 100644
index 0000000..8089ca4
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -0,0 +1,345 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.util.ToString;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.consent.InteractionResult;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
+import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.autocomplete.PropertyAutoCompleteFacet;
+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.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessContext;
+import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
+import org.apache.isis.core.metamodel.interactions.PropertyUsabilityContext;
+import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.MutableCurrentHolder;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+
+public class OneToOneAssociationDefault extends ObjectAssociationAbstract implements OneToOneAssociation {
+
+    public OneToOneAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
+                objectMemberDependencies);
+    }
+    
+    protected OneToOneAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectSpecification objectSpec,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(facetedMethod, FeatureType.PROPERTY, objectSpec, objectMemberDependencies);
+    }
+
+    //region > visible, usable
+
+    @Override
+    public VisibilityContext<?> createVisibleInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new PropertyVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+
+    @Override
+    public UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new PropertyUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+    //endregion
+
+    //region > Validity
+    private ValidityContext<?> createValidateInteractionContext(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToReferenceAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new PropertyModifyContext(ownerAdapter, getIdentifier(), proposedToReferenceAdapter,
+                interactionInitiatedBy);
+    }
+
+    @Override
+    public Consent isAssociationValid(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isAssociationValidResult(ownerAdapter, proposedAdapter, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResult isAssociationValidResult(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToReferenceAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ValidityContext<?> validityContext =
+                createValidateInteractionContext(
+                        ownerAdapter, proposedToReferenceAdapter, interactionInitiatedBy
+                );
+        return InteractionUtils.isValidResult(this, validityContext);
+    }
+
+    //endregion
+
+    //region > init
+    @Override
+    public void initAssociation(final ObjectAdapter ownerAdapter, final ObjectAdapter referencedAdapter) {
+        final PropertyInitializationFacet initializerFacet = getFacet(PropertyInitializationFacet.class);
+        if (initializerFacet != null) {
+            initializerFacet.initProperty(ownerAdapter, referencedAdapter);
+        }
+    }
+
+    //endregion
+
+    //region > Access (get, isEmpty)
+
+    @Override
+    public ObjectAdapter get(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyOrCollectionAccessorFacet facet = getFacet(PropertyOrCollectionAccessorFacet.class);
+        final Object referencedPojo =
+                facet.getProperty(ownerAdapter, interactionInitiatedBy);
+
+        if (referencedPojo == null) {
+            return null;
+        }
+
+        return getPersistenceSessionService().adapterFor(referencedPojo);
+    }
+
+    // UNUSED
+    private PropertyAccessContext createAccessInteractionContext(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ObjectAdapter referencedAdapter = get(ownerAdapter, interactionInitiatedBy);
+        return new PropertyAccessContext(
+                ownerAdapter, getIdentifier(), referencedAdapter, interactionInitiatedBy
+        );
+    }
+
+    @Override
+    public boolean isEmpty(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
+        return get(ownerAdapter, interactionInitiatedBy) == null;
+    }
+
+    //endregion
+
+    //region > Set
+    @Override
+    public void set(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter) {
+        set(ownerAdapter, newReferencedAdapter, InteractionInitiatedBy.USER);
+    }
+
+    @Override
+    public void set(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if (newReferencedAdapter != null) {
+            setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
+        } else {
+            clearValue(ownerAdapter, interactionInitiatedBy);
+        }
+    }
+
+    /**
+     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
+     */
+    @Deprecated
+    @Override
+    public void setAssociation(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
+    }
+
+    private void setValue(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertySetterFacet setterFacet = getFacet(PropertySetterFacet.class);
+        if (setterFacet == null) {
+            return;
+        }
+        if (ownerAdapter.representsPersistent() && newReferencedAdapter != null && newReferencedAdapter.isTransient() && !newReferencedAdapter.getSpecification().isParented()) {
+            // TODO: move to facet ?
+            throw new IsisException("can't set a reference to a transient object from a persistent one: " + newReferencedAdapter.titleString(null) + " (transient)");
+        }
+        setterFacet.setProperty(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
+    }
+
+    /**
+     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
+     */
+    @Deprecated
+    @Override
+    public void clearAssociation(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        clearValue(ownerAdapter, interactionInitiatedBy);
+    }
+
+    private void clearValue(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyClearFacet facet = getFacet(PropertyClearFacet.class);
+        facet.clearProperty(ownerAdapter, interactionInitiatedBy);
+    }
+
+    //endregion
+
+    //region > defaults
+    @Override
+    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
+        PropertyDefaultFacet propertyDefaultFacet = getFacet(PropertyDefaultFacet.class);
+        // if no default on the association, attempt to find a default on the
+        // specification (eg an int should
+        // default to 0).
+        if (propertyDefaultFacet == null || propertyDefaultFacet.isNoop()) {
+            propertyDefaultFacet = this.getSpecification().getFacet(PropertyDefaultFacet.class);
+        }
+        if (propertyDefaultFacet == null) {
+            return null;
+        }
+        return propertyDefaultFacet.getDefault(ownerAdapter);
+    }
+
+    @Override
+    public void toDefault(final ObjectAdapter ownerAdapter) {
+        // don't default optional fields
+        final MandatoryFacet mandatoryFacet = getFacet(MandatoryFacet.class);
+        if (mandatoryFacet != null && mandatoryFacet.isInvertedSemantics()) {
+            return;
+        }
+
+        final ObjectAdapter defaultValue = getDefault(ownerAdapter);
+        if (defaultValue != null) {
+            initAssociation(ownerAdapter, defaultValue);
+        }
+    }
+
+    //endregion
+
+    //region > choices and autoComplete
+    @Override
+    public boolean hasChoices() {
+        return getFacet(PropertyChoicesFacet.class) != null;
+    }
+
+    @Override
+    public ObjectAdapter[] getChoices(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyChoicesFacet propertyChoicesFacet = getFacet(PropertyChoicesFacet.class);
+        if (propertyChoicesFacet == null) {
+            return null;
+        }
+        final Object[] pojoOptions = propertyChoicesFacet.getChoices(
+                ownerAdapter,
+                getSpecificationLoader(),
+                interactionInitiatedBy);
+        List<ObjectAdapter> adapters = Lists.transform(
+                Lists.newArrayList(pojoOptions), ObjectAdapter.Functions.adapterForUsing(getPersistenceSessionService()));
+        return adapters.toArray(new ObjectAdapter[]{});
+    }
+
+
+    @Override
+    public boolean hasAutoComplete() {
+        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
+        return propertyAutoCompleteFacet != null;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            final ObjectAdapter ownerAdapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
+        final Object[] pojoOptions = propertyAutoCompleteFacet.autoComplete(ownerAdapter, searchArg,
+                interactionInitiatedBy);
+        if (pojoOptions != null) {
+            final ObjectAdapter[] options = new ObjectAdapter[pojoOptions.length];
+            for (int i = 0; i < options.length; i++) {
+                options[i] = getPersistenceSessionService().adapterFor(pojoOptions[i]);
+            }
+            return options;
+        }
+        return null;
+    }
+
+    @Override
+    public int getAutoCompleteMinLength() {
+        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
+        return propertyAutoCompleteFacet != null? propertyAutoCompleteFacet.getMinLength(): MinLengthUtil.MIN_LENGTH_DEFAULT;
+    }
+
+    //endregion
+
+    //region > debug, toString
+    @Override
+    public String debugData() {
+        final DebugString debugString = new DebugString();
+        debugString.indent();
+        debugString.indent();
+        getFacetedMethod().debugData(debugString);
+        return debugString.toString();
+    }
+
+    @Override
+    public String toString() {
+        final ToString str = new ToString(this);
+        str.append(super.toString());
+        str.setAddComma();
+        str.append("persisted", !isNotPersisted());
+        str.append("type", getSpecification().getShortIdentifier());
+        return str.toString();
+    }
+    //endregion
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
deleted file mode 100644
index 07874fa..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.util.ToString;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
-import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.autocomplete.PropertyAutoCompleteFacet;
-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.update.clear.PropertyClearFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.PropertyAccessContext;
-import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
-import org.apache.isis.core.metamodel.interactions.PropertyUsabilityContext;
-import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.MutableCurrentHolder;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-
-public class OneToOneAssociationImpl extends ObjectAssociationAbstract implements OneToOneAssociation {
-
-    public OneToOneAssociationImpl(
-            final FacetedMethod facetedMethod,
-            final ObjectMemberDependencies objectMemberDependencies) {
-        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
-                objectMemberDependencies);
-    }
-    
-    protected OneToOneAssociationImpl(
-            final FacetedMethod facetedMethod,
-            final ObjectSpecification objectSpec,
-            final ObjectMemberDependencies objectMemberDependencies) {
-        super(facetedMethod, FeatureType.PROPERTY, objectSpec, objectMemberDependencies);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Hidden (or visible)
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public VisibilityContext<?> createVisibleInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new PropertyVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Disabled (or enabled)
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public UsabilityContext<?> createUsableInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new PropertyUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Validate
-    // /////////////////////////////////////////////////////////////
-
-    private ValidityContext<?> createValidateInteractionContext(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToReferenceAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new PropertyModifyContext(ownerAdapter, getIdentifier(), proposedToReferenceAdapter,
-                interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isAssociationValid(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isAssociationValidResult(ownerAdapter, proposedAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isAssociationValidResult(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToReferenceAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext<?> validityContext =
-                createValidateInteractionContext(
-                        ownerAdapter, proposedToReferenceAdapter, interactionInitiatedBy
-                );
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // init
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public void initAssociation(final ObjectAdapter ownerAdapter, final ObjectAdapter referencedAdapter) {
-        final PropertyInitializationFacet initializerFacet = getFacet(PropertyInitializationFacet.class);
-        if (initializerFacet != null) {
-            initializerFacet.initProperty(ownerAdapter, referencedAdapter);
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Access (get, isEmpty)
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public ObjectAdapter get(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyOrCollectionAccessorFacet facet = getFacet(PropertyOrCollectionAccessorFacet.class);
-        final Object referencedPojo =
-                facet.getProperty(ownerAdapter, interactionInitiatedBy);
-
-        if (referencedPojo == null) {
-            return null;
-        }
-
-        return getPersistenceSessionService().adapterFor(referencedPojo);
-    }
-
-    // UNUSED
-    private PropertyAccessContext createAccessInteractionContext(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ObjectAdapter referencedAdapter = get(ownerAdapter, interactionInitiatedBy);
-        return new PropertyAccessContext(
-                ownerAdapter, getIdentifier(), referencedAdapter, interactionInitiatedBy
-        );
-    }
-
-    @Override
-    public boolean isEmpty(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        return get(ownerAdapter, interactionInitiatedBy) == null;
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Set
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public void set(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter) {
-        set(ownerAdapter, newReferencedAdapter, InteractionInitiatedBy.USER);
-    }
-
-    @Override
-    public void set(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (newReferencedAdapter != null) {
-            setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-        } else {
-            clearValue(ownerAdapter, interactionInitiatedBy);
-        }
-    }
-
-    /**
-     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
-     */
-    @Deprecated
-    @Override
-    public void setAssociation(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-    }
-
-    private void setValue(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertySetterFacet setterFacet = getFacet(PropertySetterFacet.class);
-        if (setterFacet == null) {
-            return;
-        }
-        if (ownerAdapter.representsPersistent() && newReferencedAdapter != null && newReferencedAdapter.isTransient() && !newReferencedAdapter.getSpecification().isParented()) {
-            // TODO: move to facet ?
-            throw new IsisException("can't set a reference to a transient object from a persistent one: " + newReferencedAdapter.titleString(null) + " (transient)");
-        }
-        setterFacet.setProperty(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-    }
-
-    /**
-     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
-     */
-    @Deprecated
-    @Override
-    public void clearAssociation(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        clearValue(ownerAdapter, interactionInitiatedBy);
-    }
-
-    private void clearValue(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyClearFacet facet = getFacet(PropertyClearFacet.class);
-        facet.clearProperty(ownerAdapter, interactionInitiatedBy);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // defaults
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
-        PropertyDefaultFacet propertyDefaultFacet = getFacet(PropertyDefaultFacet.class);
-        // if no default on the association, attempt to find a default on the
-        // specification (eg an int should
-        // default to 0).
-        if (propertyDefaultFacet == null || propertyDefaultFacet.isNoop()) {
-            propertyDefaultFacet = this.getSpecification().getFacet(PropertyDefaultFacet.class);
-        }
-        if (propertyDefaultFacet == null) {
-            return null;
-        }
-        return propertyDefaultFacet.getDefault(ownerAdapter);
-    }
-
-    @Override
-    public void toDefault(final ObjectAdapter ownerAdapter) {
-        // don't default optional fields
-        final MandatoryFacet mandatoryFacet = getFacet(MandatoryFacet.class);
-        if (mandatoryFacet != null && mandatoryFacet.isInvertedSemantics()) {
-            return;
-        }
-
-        final ObjectAdapter defaultValue = getDefault(ownerAdapter);
-        if (defaultValue != null) {
-            initAssociation(ownerAdapter, defaultValue);
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // choices and autoComplete
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public boolean hasChoices() {
-        return getFacet(PropertyChoicesFacet.class) != null;
-    }
-
-    @Override
-    public ObjectAdapter[] getChoices(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyChoicesFacet propertyChoicesFacet = getFacet(PropertyChoicesFacet.class);
-        if (propertyChoicesFacet == null) {
-            return null;
-        }
-        final Object[] pojoOptions = propertyChoicesFacet.getChoices(
-                ownerAdapter,
-                getSpecificationLoader(),
-                interactionInitiatedBy);
-        List<ObjectAdapter> adapters = Lists.transform(
-                Lists.newArrayList(pojoOptions), ObjectAdapter.Functions.adapterForUsing(getPersistenceSessionService()));
-        return adapters.toArray(new ObjectAdapter[]{});
-    }
-
-
-    @Override
-    public boolean hasAutoComplete() {
-        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
-        return propertyAutoCompleteFacet != null;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            final ObjectAdapter ownerAdapter,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
-        final Object[] pojoOptions = propertyAutoCompleteFacet.autoComplete(ownerAdapter, searchArg,
-                interactionInitiatedBy);
-        if (pojoOptions != null) {
-            final ObjectAdapter[] options = new ObjectAdapter[pojoOptions.length];
-            for (int i = 0; i < options.length; i++) {
-                options[i] = getPersistenceSessionService().adapterFor(pojoOptions[i]);
-            }
-            return options;
-        }
-        return null;
-    }
-
-    @Override
-    public int getAutoCompleteMinLength() {
-        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
-        return propertyAutoCompleteFacet != null? propertyAutoCompleteFacet.getMinLength(): MinLengthUtil.MIN_LENGTH_DEFAULT;
-    }
-
-
-    // /////////////////////////////////////////////////////////////
-    // debug, toString
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public String debugData() {
-        final DebugString debugString = new DebugString();
-        debugString.indent();
-        debugString.indent();
-        getFacetedMethod().debugData(debugString);
-        return debugString.toString();
-    }
-
-    @Override
-    public String toString() {
-        final ToString str = new ToString(this);
-        str.append(super.toString());
-        str.setAddComma();
-        str.append("persisted", !isNotPersisted());
-        str.append("type", getSpecification().getShortIdentifier());
-        return str.toString();
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 2e0512f..071f760 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -65,10 +65,10 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder;
 import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
-import org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationImpl;
-import org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationImpl;
+import org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationDefault;
+import org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationDefault;
 
 public class ObjectSpecificationDefault extends ObjectSpecificationAbstract implements DebuggableWithTitle, FacetHolder {
 
@@ -223,9 +223,9 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     private ObjectAssociation createAssociation(final FacetedMethod facetMethod) {
         if (facetMethod.getFeatureType().isCollection()) {
-            return new OneToManyAssociationImpl(facetMethod, objectMemberDependencies);
+            return new OneToManyAssociationDefault(facetMethod, objectMemberDependencies);
         } else if (facetMethod.getFeatureType().isProperty()) {
-            return new OneToOneAssociationImpl(facetMethod, objectMemberDependencies);
+            return new OneToOneAssociationDefault(facetMethod, objectMemberDependencies);
         } else {
             return null;
         }
@@ -246,7 +246,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     private ObjectAction createAction(final FacetedMethod facetedMethod) {
         if (facetedMethod.getFeatureType().isAction()) {
-            return new ObjectActionImpl(facetedMethod, objectMemberDependencies);
+            return new ObjectActionDefault(facetedMethod, objectMemberDependencies);
         } else {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
new file mode 100644
index 0000000..fdb3eaf
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
@@ -0,0 +1,44 @@
+package org.apache.isis.core.metamodel.specloader.specimpl;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ObjectActionMixedInTest {
+
+
+    public static class SuffixAfterUnderscore extends ObjectActionMixedInTest {
+
+        @Test
+        public void exactly_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("_");
+            assertThat(s, is("_"));
+        }
+
+        @Test
+        public void ends_with_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_");
+            assertThat(s, is("Abc_"));
+        }
+
+        @Test
+        public void has_no_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("defghij");
+            assertThat(s, is("Defghij"));
+        }
+
+        @Test
+        public void contains_one_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_def");
+            assertThat(s, is("Def"));
+        }
+
+        @Test
+        public void contains_more_than_one_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_def_ghi");
+            assertThat(s, is("Ghi"));
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index a115fda..5bf63dc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -37,7 +37,6 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
@@ -49,7 +48,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
     @Mock
-    private ObjectActionImpl parentAction;
+    private ObjectActionDefault parentAction;
     @Mock
     private TypedHolder actionParamPeer;
     @Mock
@@ -64,7 +63,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
 
     private final static class ObjectActionParameterAbstractToTest extends ObjectActionParameterAbstract {
-        private ObjectActionParameterAbstractToTest(final int number, final ObjectActionImpl objectAction, final TypedHolder peer) {
+        private ObjectActionParameterAbstractToTest(final int number, final ObjectActionDefault objectAction, final TypedHolder peer) {
             super(number, objectAction, peer);
         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java
new file mode 100644
index 0000000..7e446c1
--- /dev/null
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java
@@ -0,0 +1,107 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.runtime.system;
+
+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.applib.Identifier;
+import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
+import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+public class ObjectActionDefaultTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+    
+    
+    private ObjectActionDefault action;
+    
+    @Mock
+    private FacetedMethod mockFacetedMethod;
+
+    @Mock
+    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
+    @Mock
+    private SpecificationLoader mockSpecificationLookup;
+    @Mock
+    private AdapterManager mockAdapterManager;
+    @Mock
+    private ServicesInjector mockServicesInjector;
+    @Mock
+    private MessageBrokerService mockMessageBrokerService;
+    @Mock
+    private PersistenceSessionService mockPersistenceSessionService;
+
+    @Before
+    public void setUp() throws Exception {
+
+        context.checking(new Expectations() {
+            {
+                one(mockFacetedMethod).getIdentifier();
+                will(returnValue(Identifier.actionIdentifier("Customer", "reduceheadcount")));
+            }
+        });
+
+        action = new ObjectActionDefault(mockFacetedMethod, new ObjectMemberDependencies(
+                mockSpecificationLookup, mockServicesInjector,
+                mockPersistenceSessionService));
+    }
+
+
+    @Test
+    public void testNameDefaultsToActionsMethodName() {
+        final String name = "Reduceheadcount";
+        final NamedFacet facet = new NamedFacetAbstract(name, true, mockFacetedMethod) {
+        };
+        context.checking(new Expectations() {
+            {
+                one(mockFacetedMethod).getFacet(NamedFacet.class);
+                will(returnValue(facet));
+            }
+        });
+        assertThat(action.getName(), is(equalTo(name)));
+    }
+
+    @Test
+    public void testId() {
+        assertEquals("reduceheadcount", action.getId());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
deleted file mode 100644
index 307ff00..0000000
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.system;
-
-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.applib.Identifier;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
-import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-public class ObjectActionImplTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-    
-    
-    private ObjectActionImpl action;
-    
-    @Mock
-    private FacetedMethod mockFacetedMethod;
-
-    @Mock
-    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
-    @Mock
-    private SpecificationLoader mockSpecificationLookup;
-    @Mock
-    private AdapterManager mockAdapterManager;
-    @Mock
-    private ServicesInjector mockServicesInjector;
-    @Mock
-    private MessageBrokerService mockMessageBrokerService;
-    @Mock
-    private PersistenceSessionService mockPersistenceSessionService;
-
-    @Before
-    public void setUp() throws Exception {
-
-        context.checking(new Expectations() {
-            {
-                one(mockFacetedMethod).getIdentifier();
-                will(returnValue(Identifier.actionIdentifier("Customer", "reduceheadcount")));
-            }
-        });
-
-        action = new ObjectActionImpl(mockFacetedMethod, new ObjectMemberDependencies(
-                mockSpecificationLookup, mockServicesInjector,
-                mockPersistenceSessionService));
-    }
-
-
-    @Test
-    public void testNameDefaultsToActionsMethodName() {
-        final String name = "Reduceheadcount";
-        final NamedFacet facet = new NamedFacetAbstract(name, true, mockFacetedMethod) {
-        };
-        context.checking(new Expectations() {
-            {
-                one(mockFacetedMethod).getFacet(NamedFacet.class);
-                will(returnValue(facet));
-            }
-        });
-        assertThat(action.getName(), is(equalTo(name)));
-    }
-
-    @Test
-    public void testId() {
-        assertEquals("reduceheadcount", action.getId());
-    }
-
-}