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

[54/61] ISIS-831: property and collection interactions stuff more or less there...

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetClearPostsPropertyChangedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetClearPostsPropertyChangedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetClearPostsPropertyChangedEventAnnotation.java
deleted file mode 100644
index eb75bf2..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetClearPostsPropertyChangedEventAnnotation.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.properties.interaction;
-
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-
-public class InteractionWithPropertyFacetClearPostsPropertyChangedEventAnnotation
-        extends InteractionWithPropertyClearFacetAbstract {
-
-
-    public InteractionWithPropertyFacetClearPostsPropertyChangedEventAnnotation(
-            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
-            final PropertyOrCollectionAccessorFacet getterFacet,
-            final PropertyClearFacet clearFacet,
-            final ServicesInjector servicesInjector,
-            final FacetHolder holder) {
-        super(eventType, getterFacet, clearFacet, servicesInjector, holder);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetFactory.java
deleted file mode 100644
index a3cd70a..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetFactory.java
+++ /dev/null
@@ -1,134 +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.facets.properties.interaction;
-
-import java.lang.reflect.Method;
-import java.util.Comparator;
-import java.util.List;
-import org.apache.isis.applib.annotation.InteractionWithProperty;
-import org.apache.isis.applib.annotation.PostsPropertyChangedEvent;
-import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor;
-import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-
-public class InteractionWithPropertyFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware, MetaModelValidatorRefiner {
-
-    private ServicesInjector servicesInjector;
-
-    public InteractionWithPropertyFacetFactory() {
-        super(FeatureType.PROPERTIES_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        final Method method = processMethodContext.getMethod();
-        FacetedMethod holder = processMethodContext.getFacetHolder();
-
-        final PropertyOrCollectionAccessorFacet getterFacet = holder.getFacet(PropertyOrCollectionAccessorFacet.class);
-        if(getterFacet == null) {
-            return;
-        }
-
-        final InteractionWithProperty interactionWithProperty = Annotations.getAnnotation(method, InteractionWithProperty.class);
-        final PostsPropertyChangedEvent postsPropertyChangedEvent = Annotations.getAnnotation(method, PostsPropertyChangedEvent.class);
-
-        final PropertySetterFacet setterFacet = holder.getFacet(PropertySetterFacet.class);
-        if(setterFacet != null) {
-            if(interactionWithProperty != null) {
-                final Class<? extends PropertyInteractionEvent<?, ?>> eventType = interactionWithProperty.value();
-                FacetUtil.addFacet(new InteractionWithPropertyFacetSetterAnnotation(eventType, getterFacet, setterFacet, servicesInjector, holder));
-            } else if(postsPropertyChangedEvent != null) {
-                final Class<? extends PropertyChangedEvent<?, ?>> eventType = postsPropertyChangedEvent.value();
-                FacetUtil.addFacet(new InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation(eventType, getterFacet, setterFacet, servicesInjector, holder));
-            } else {
-                final Class<? extends PropertyInteractionEvent<?, ?>> eventType = PropertyInteractionEvent.Default.class;
-                FacetUtil.addFacet(new InteractionWithPropertyFacetSetterDefault(eventType, getterFacet, setterFacet, servicesInjector, holder));
-            }
-        }
-        
-        final PropertyClearFacet clearFacet = holder.getFacet(PropertyClearFacet.class);
-        if(clearFacet != null) {
-            if(interactionWithProperty != null) {
-                final Class<? extends PropertyInteractionEvent<?, ?>> eventType = interactionWithProperty.value();
-                FacetUtil.addFacet(new InteractionWithPropertyFacetClearAnnotation(eventType, getterFacet, clearFacet, servicesInjector, holder));
-            } else if(postsPropertyChangedEvent != null) {
-                final Class<? extends PropertyChangedEvent<?, ?>> changedEventType = postsPropertyChangedEvent.value();
-                FacetUtil.addFacet(new InteractionWithPropertyFacetClearAnnotation(changedEventType, getterFacet, clearFacet, servicesInjector, holder));
-            } else {
-                final Class<? extends PropertyInteractionEvent<?, ?>> eventType = PropertyInteractionEvent.Default.class;
-                FacetUtil.addFacet(new InteractionWithPropertyFacetClearAnnotation(eventType, getterFacet, clearFacet, servicesInjector, holder));
-            }
-        }
-    }
-
-    // //////////////////////////////////////
-    
-    @Override
-    public void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator, IsisConfiguration configuration) {
-        metaModelValidator.add(new MetaModelValidatorVisiting(newValidatorVisitor()));
-    }
-
-    protected Visitor newValidatorVisitor() {
-        return new MetaModelValidatorVisiting.Visitor() {
-
-            @Override
-            public boolean visit(ObjectSpecification objectSpec, ValidationFailures validationFailures) {
-                List<OneToManyAssociation> objectCollections = objectSpec.getCollections(Contributed.EXCLUDED);
-                for (OneToManyAssociation objectCollection : objectCollections) {
-                    final SortedByFacet facet = objectCollection.getFacet(SortedByFacet.class);
-                    if(facet != null) {
-                        final Class<? extends Comparator<?>> cls = facet.value();
-                        if(!Comparator.class.isAssignableFrom(cls)) {
-                            validationFailures.add("%s#%s is annotated with @SortedBy, but the class specified '%s' is not a Comparator", objectSpec.getIdentifier().getClassName(), objectCollection.getId(), facet.value().getName());
-                        }
-                    }
-                }
-                return true;
-            }
-        };
-    }
-
-    // //////////////////////////////////////
-
-    @Override
-    public void setServicesInjector(ServicesInjector servicesInjector) {
-        this.servicesInjector = servicesInjector;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterAnnotation.java
deleted file mode 100644
index 38f1a96..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterAnnotation.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.properties.interaction;
-
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-
-public class InteractionWithPropertyFacetSetterAnnotation
-        extends InteractionWithPropertySetterFacetAbstract {
-
-
-    public InteractionWithPropertyFacetSetterAnnotation(
-            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
-            final PropertyOrCollectionAccessorFacet getterFacet,
-            final PropertySetterFacet setterFacet,
-            final ServicesInjector servicesInjector,
-            final FacetHolder holder) {
-        super(eventType, getterFacet, setterFacet, servicesInjector, holder);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterDefault.java
deleted file mode 100644
index 719f354..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterDefault.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.properties.interaction;
-
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-
-public class InteractionWithPropertyFacetSetterDefault
-        extends InteractionWithPropertySetterFacetAbstract {
-
-
-    public InteractionWithPropertyFacetSetterDefault(
-            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
-            final PropertyOrCollectionAccessorFacet getterFacet,
-            final PropertySetterFacet setterFacet,
-            final ServicesInjector servicesInjector,
-            final FacetHolder holder) {
-        super(eventType, getterFacet, setterFacet, servicesInjector, holder);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation.java
deleted file mode 100644
index 1611dc5..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.properties.interaction;
-
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-
-public class InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation
-        extends InteractionWithPropertySetterFacetAbstract {
-
-
-    public InteractionWithPropertyFacetSetterPostsPropertyChangedEventAnnotation(
-            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
-            final PropertyOrCollectionAccessorFacet getterFacet,
-            final PropertySetterFacet setterFacet,
-            final ServicesInjector servicesInjector,
-            final FacetHolder holder) {
-        super(eventType, getterFacet, setterFacet, servicesInjector, holder);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacet.java
deleted file mode 100644
index e39e7b8..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacet.java
+++ /dev/null
@@ -1,46 +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.facets.properties.interaction;
-
-import java.lang.reflect.InvocationTargetException;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.metamodel.facets.SingleValueFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-
-/**
- * Indicates that (the specified subclass of) {@link PropertyInteractionEvent} should be posted to the
- * {@link EventBusService}.
- */
-public interface InteractionWithPropertySetterFacet extends SingleValueFacet<Class<? extends PropertyInteractionEvent<?,?>>>, PropertySetterFacet {
-
-    public static class Util {
-        private Util(){}
-        public static <S,T> PropertyInteractionEvent<S,T> newEvent(
-                final Class<? extends PropertyInteractionEvent<S, T>> type,
-                final S source, 
-                final Identifier identifier,
-                final T oldValue, 
-                final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
-            return Utils.newEvent(type, source, identifier, oldValue, newValue);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacetAbstract.java
deleted file mode 100644
index 10bbbbd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/InteractionWithPropertySetterFacetAbstract.java
+++ /dev/null
@@ -1,104 +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.facets.properties.interaction;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
-import org.apache.isis.applib.services.eventbus.AbstractInteractionEvent;
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
-import org.apache.isis.core.metamodel.facets.InteractionHelper;
-import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-
-public abstract class InteractionWithPropertySetterFacetAbstract
-        extends SingleValueFacetAbstract<Class<? extends PropertyInteractionEvent<?,?>>>
-        implements InteractionWithPropertySetterFacet, MultiTypedFacet {
-
-
-    public static Class<? extends Facet> type() {
-        return PropertySetterFacet.class;
-    }
-
-    private final PropertyOrCollectionAccessorFacet getterFacet;
-    private final PropertySetterFacet setterFacet;
-    private final InteractionHelper interactionHelper;
-
-    public InteractionWithPropertySetterFacetAbstract(
-            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
-            final PropertyOrCollectionAccessorFacet getterFacet,
-            final PropertySetterFacet setterFacet,
-            final ServicesInjector servicesInjector,
-            final FacetHolder holder) {
-        super(type(), eventType, holder);
-        this.getterFacet = getterFacet;
-        this.setterFacet = setterFacet;
-        this.interactionHelper = new InteractionHelper(servicesInjector, AbstractInteractionEvent.Mode.EXECUTE);
-    }
-
-    @Override
-    public void setProperty(ObjectAdapter targetAdapter, ObjectAdapter valueAdapter) {
-        if(setterFacet == null) {
-            return;
-        }
-        if(!interactionHelper.hasEventBusService()) {
-            setterFacet.setProperty(targetAdapter, valueAdapter);
-            return;
-        }
-
-        final Object oldValue = getterFacet.getProperty(targetAdapter);
-        setterFacet.setProperty(targetAdapter, valueAdapter);
-        final Object newValue = getterFacet.getProperty(targetAdapter);
-
-        if(Objects.equal(oldValue, newValue)) {
-            // do nothing.
-            return;
-        }
-
-        interactionHelper.postEventForPropertySet(value(), targetAdapter, getIdentified(), oldValue, newValue);
-    }
-
-
-
-    // //////////////////////////////////////
-    // MultiTypedFacet
-    // //////////////////////////////////////
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Class<? extends Facet>[] facetTypes() {
-        return Lists.newArrayList(
-                type(),
-                InteractionWithPropertySetterFacet.class
-        ).toArray(new Class[]{});
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Facet> T getFacet(Class<T> facet) {
-        return (T) this;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForInteractionAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForInteractionAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForInteractionAbstract.java
new file mode 100644
index 0000000..460b931
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForInteractionAbstract.java
@@ -0,0 +1,104 @@
+/*
+ *  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.facets.properties.interaction;
+
+import com.google.common.base.Objects;
+import org.apache.isis.applib.services.eventbus.AbstractInteractionEvent;
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.InteractionHelper;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public abstract class PropertyClearFacetForInteractionAbstract
+        extends SingleValueFacetAbstract<Class<? extends PropertyInteractionEvent<?,?>>>
+        implements PropertyClearFacet {
+
+
+    public static Class<? extends Facet> type() {
+        return PropertyClearFacet.class;
+    }
+
+    private final InteractionHelper interactionHelper;
+
+    private final PropertyOrCollectionAccessorFacet getterFacet;
+    private final PropertyClearFacet clearFacet;
+    private final PropertyInteractionFacetAbstract propertyInteractionFacet;
+
+    public PropertyClearFacetForInteractionAbstract(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertyClearFacet clearFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(type(), eventType, holder);
+        this.getterFacet = getterFacet;
+        this.clearFacet = clearFacet;
+        this.propertyInteractionFacet = propertyInteractionFacet;
+        this.interactionHelper = new InteractionHelper(servicesInjector);
+    }
+
+    @Override
+    public void clearProperty(ObjectAdapter targetAdapter) {
+        if(clearFacet == null) {
+            return;
+        }
+
+        if(!interactionHelper.hasEventBusService()) {
+            clearFacet.clearProperty(targetAdapter);
+            return;
+        }
+
+        final Object oldValue = getterFacet.getProperty(targetAdapter);
+        clearFacet.clearProperty(targetAdapter);
+        final Object newValue = getterFacet.getProperty(targetAdapter);
+
+        if(Objects.equal(oldValue, newValue)) {
+            // do nothing.
+            return;
+        }
+
+        // ... and post the event (reusing existing event if available)
+        final PropertyInteractionEvent<?, ?> event = propertyInteractionFacet.currentInteraction.get();
+        interactionHelper.postEventForProperty(value(), verify(event), AbstractInteractionEvent.Phase.EXECUTE, targetAdapter, getIdentified(), oldValue, newValue);
+
+        // clean up
+        propertyInteractionFacet.currentInteraction.set(null);
+    }
+
+    /**
+     * Optional hook to allow the facet implementation for the deprecated {@link org.apache.isis.applib.annotation.PostsPropertyChangedEvent} annotation
+     * to discard the event if of a different type.
+     */
+    protected PropertyInteractionEvent<?, ?> verify(PropertyInteractionEvent<?, ?> event) {
+        return event;
+    }
+
+    private Class<? extends PropertyInteractionEvent<?, ?>> eventType() {
+        return value();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPostsPropertyChangedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPostsPropertyChangedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPostsPropertyChangedEventAnnotation.java
new file mode 100644
index 0000000..3309e76
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPostsPropertyChangedEventAnnotation.java
@@ -0,0 +1,48 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PropertyClearFacetForPostsPropertyChangedEventAnnotation
+        extends PropertyClearFacetForInteractionAbstract {
+
+
+    public PropertyClearFacetForPostsPropertyChangedEventAnnotation(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertyClearFacet clearFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, getterFacet, clearFacet, propertyInteractionFacet, servicesInjector, holder);
+    }
+
+    @Override
+    protected PropertyInteractionEvent<?, ?> verify(final PropertyInteractionEvent<?, ?> event) {
+        // will discard event if different type to that specified in the PostsPropertyChangedEvent annotation.
+        return event != null && value() == event.getClass() ? event : null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionAnnotation.java
new file mode 100644
index 0000000..729bd33
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionAnnotation.java
@@ -0,0 +1,41 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PropertyClearFacetForPropertyInteractionAnnotation
+        extends PropertyClearFacetForInteractionAbstract {
+
+
+    public PropertyClearFacetForPropertyInteractionAnnotation(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertyClearFacet clearFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, getterFacet, clearFacet, propertyInteractionFacet, servicesInjector, holder);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionDefault.java
new file mode 100644
index 0000000..8bc70bb
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyClearFacetForPropertyInteractionDefault.java
@@ -0,0 +1,41 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PropertyClearFacetForPropertyInteractionDefault
+        extends PropertyClearFacetForInteractionAbstract {
+
+
+    public PropertyClearFacetForPropertyInteractionDefault(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertyClearFacet clearFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, getterFacet, clearFacet, propertyInteractionFacet, servicesInjector, holder);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacet.java
new file mode 100644
index 0000000..939fe62
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacet.java
@@ -0,0 +1,33 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.core.metamodel.facets.SingleClassValueFacet;
+import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
+import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
+import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
+
+/**
+ * Corresponds to <tt>@PropertyInteraction</tt> annotation in the Isis programming model.
+ */
+public interface PropertyInteractionFacet
+        extends SingleClassValueFacet, HidingInteractionAdvisor, DisablingInteractionAdvisor, ValidatingInteractionAdvisor {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAbstract.java
new file mode 100644
index 0000000..eb66867
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAbstract.java
@@ -0,0 +1,123 @@
+/*
+ *  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.facets.properties.interaction;
+
+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.services.eventbus.AbstractInteractionEvent;
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.InteractionHelper;
+import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.interactions.ProposedHolder;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+public abstract class PropertyInteractionFacetAbstract
+        extends SingleClassValueFacetAbstract implements PropertyInteractionFacet {
+
+    private final InteractionHelper interactionHelper;
+
+    final static ThreadLocal<PropertyInteractionEvent<?,?>> currentInteraction = new ThreadLocal<PropertyInteractionEvent<?,?>>();
+
+    private final PropertyOrCollectionAccessorFacet getterFacet;
+
+    public PropertyInteractionFacetAbstract(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final FacetHolder holder,
+            final ServicesInjector servicesInjector,
+            final SpecificationLoader specificationLoader) {
+        super(PropertyInteractionFacet.class, holder, eventType, specificationLoader);
+        this.getterFacet = getterFacet;
+        interactionHelper = new InteractionHelper(servicesInjector);
+    }
+
+    @Override
+    public String hides(VisibilityContext<? extends VisibilityEvent> ic) {
+        if(!interactionHelper.hasEventBusService()) {
+            return null;
+        }
+
+        final PropertyInteractionEvent<?, ?> event =
+                interactionHelper.postEventForProperty(
+                        eventType(), null, AbstractInteractionEvent.Phase.HIDE, ic.getTarget(), getIdentified(), null, null);
+        if (event == null || !event.isHidden()) {
+            // make available for next phase
+            currentInteraction.set(event);
+            return null;
+        } else {
+            // clean up
+            currentInteraction.set(null);
+            return "Hidden by subscriber";
+        }
+    }
+
+    @Override
+    public String disables(UsabilityContext<? extends UsabilityEvent> ic) {
+        final PropertyInteractionEvent<?, ?> existingEvent = currentInteraction.get();
+        final PropertyInteractionEvent<?, ?> event =
+                interactionHelper.postEventForProperty(
+                    eventType(), existingEvent, AbstractInteractionEvent.Phase.DISABLE, ic.getTarget(), getIdentified(), null, null);
+        if (event == null || !event.isDisabled()) {
+            // make available for next phase
+            currentInteraction.set(event);
+            return null;
+        } else {
+            // clean up
+            currentInteraction.set(null);
+            return event.getDisabledReason();
+        }
+    }
+
+    @Override
+    public String invalidates(ValidityContext<? extends ValidityEvent> ic) {
+
+        final PropertyInteractionEvent<?, ?> existingEvent = currentInteraction.get();
+
+        final Object oldValue = getterFacet.getProperty(ic.getTarget());
+
+        final ProposedHolder ph = (ProposedHolder) ic;
+        final Object proposedValue = ph.getProposed().getObject();
+
+        final PropertyInteractionEvent<?, ?> event =
+                interactionHelper.postEventForProperty(
+                        eventType(), existingEvent, AbstractInteractionEvent.Phase.VALIDATE, ic.getTarget(), getIdentified(), oldValue, proposedValue);
+        if(event == null || !event.isInvalid()) {
+            // make available for next phase
+            currentInteraction.set(event);
+            return null;
+        } else {
+            // clean up
+            currentInteraction.set(null);
+            return event.getInvalidityReason();
+        }
+    }
+
+    private Class<?> eventType() {
+        return value();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAnnotation.java
new file mode 100644
index 0000000..84050af
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetAnnotation.java
@@ -0,0 +1,39 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+public class PropertyInteractionFacetAnnotation extends PropertyInteractionFacetAbstract {
+
+    public PropertyInteractionFacetAnnotation(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final FacetHolder holder,
+            final ServicesInjector servicesInjector,
+            final SpecificationLoader specificationLoader) {
+        super(eventType, getterFacet, holder, servicesInjector, specificationLoader);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetDefault.java
new file mode 100644
index 0000000..0098182
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetDefault.java
@@ -0,0 +1,39 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+public class PropertyInteractionFacetDefault extends PropertyInteractionFacetAbstract {
+
+    public PropertyInteractionFacetDefault(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final FacetHolder holder,
+            final ServicesInjector servicesInjector,
+            final SpecificationLoader specificationLoader) {
+        super(eventType, getterFacet, holder, servicesInjector, specificationLoader);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetFactory.java
new file mode 100644
index 0000000..a11bb2a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertyInteractionFacetFactory.java
@@ -0,0 +1,157 @@
+/*
+ *  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.facets.properties.interaction;
+
+import java.lang.reflect.Method;
+import java.util.Comparator;
+import java.util.List;
+import org.apache.isis.applib.annotation.PostsPropertyChangedEvent;
+import org.apache.isis.applib.annotation.PropertyInteraction;
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor;
+import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
+
+public class PropertyInteractionFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware, MetaModelValidatorRefiner {
+
+    private ServicesInjector servicesInjector;
+
+    public PropertyInteractionFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        FacetedMethod holder = processMethodContext.getFacetHolder();
+
+        final PropertyOrCollectionAccessorFacet getterFacet = holder.getFacet(PropertyOrCollectionAccessorFacet.class);
+        if(getterFacet == null) {
+            return;
+        }
+
+        //
+        // Set up PropertyInteractionFacet, which will act as the hiding/disabling/validating advisor
+        //
+        final PropertyInteraction propertyInteraction = Annotations.getAnnotation(method, PropertyInteraction.class);
+        final Class<? extends PropertyInteractionEvent<?, ?>> propertyInteractionEventType;
+
+        final PropertyInteractionFacetAbstract propertyInteractionFacet;
+        if(propertyInteraction != null) {
+            propertyInteractionEventType = propertyInteraction.value();
+            propertyInteractionFacet = new PropertyInteractionFacetAnnotation(propertyInteractionEventType, getterFacet, holder, servicesInjector, getSpecificationLoader());
+        } else {
+            propertyInteractionEventType = PropertyInteractionEvent.Default.class;
+            propertyInteractionFacet = new PropertyInteractionFacetDefault(propertyInteractionEventType, getterFacet, holder, servicesInjector, getSpecificationLoader());
+        }
+        FacetUtil.addFacet(propertyInteractionFacet);
+
+
+        //
+        // if the property is mutable, then replace the existing setter and clear facets with equivalents that
+        // also post to the event bus.
+        //
+        // here we support the deprecated annotations
+        //
+
+
+        final PostsPropertyChangedEvent postsPropertyChangedEvent = Annotations.getAnnotation(method, PostsPropertyChangedEvent.class);
+
+        final PropertySetterFacet setterFacet = holder.getFacet(PropertySetterFacet.class);
+        if(setterFacet != null) {
+            // the current setter facet will end up as the underlying facet
+            final PropertySetterFacetForInteractionAbstract replacementFacet;
+            if(propertyInteraction != null) {
+                replacementFacet = new PropertySetterFacetForPropertyInteractionAnnotation(propertyInteractionEventType, getterFacet, setterFacet, propertyInteractionFacet, servicesInjector, holder);
+            } else if(postsPropertyChangedEvent != null) {
+                replacementFacet = new PropertySetterFacetForPostsPropertyChangedEventAnnotation(postsPropertyChangedEvent.value(), getterFacet, setterFacet, propertyInteractionFacet, servicesInjector, holder);
+            } else {
+                replacementFacet = new PropertySetterFacetForPropertyInteractionDefault(PropertyInteractionEvent.Default.class, getterFacet, setterFacet, propertyInteractionFacet, servicesInjector, holder);
+            }
+            FacetUtil.addFacet(replacementFacet);
+        }
+        
+        final PropertyClearFacet clearFacet = holder.getFacet(PropertyClearFacet.class);
+        if(clearFacet != null) {
+            // the current clear facet will end up as the underlying facet
+            final PropertyClearFacetForInteractionAbstract replacementFacet;
+            if(propertyInteraction != null) {
+                replacementFacet = new PropertyClearFacetForPropertyInteractionAnnotation(propertyInteractionEventType, getterFacet, clearFacet, propertyInteractionFacet, servicesInjector, holder);
+            } else if(postsPropertyChangedEvent != null) {
+                replacementFacet = new PropertyClearFacetForPostsPropertyChangedEventAnnotation(postsPropertyChangedEvent.value(), getterFacet, clearFacet, propertyInteractionFacet, servicesInjector, holder);
+            } else {
+                replacementFacet = new PropertyClearFacetForPropertyInteractionDefault(PropertyInteractionEvent.Default.class, getterFacet, clearFacet, propertyInteractionFacet, servicesInjector, holder);
+            }
+            FacetUtil.addFacet(replacementFacet);
+        }
+    }
+
+    // //////////////////////////////////////
+    
+    @Override
+    public void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator, IsisConfiguration configuration) {
+        metaModelValidator.add(new MetaModelValidatorVisiting(newValidatorVisitor()));
+    }
+
+    protected Visitor newValidatorVisitor() {
+        return new MetaModelValidatorVisiting.Visitor() {
+
+            @Override
+            public boolean visit(ObjectSpecification objectSpec, ValidationFailures validationFailures) {
+                List<OneToManyAssociation> objectCollections = objectSpec.getCollections(Contributed.EXCLUDED);
+                for (OneToManyAssociation objectCollection : objectCollections) {
+                    final SortedByFacet facet = objectCollection.getFacet(SortedByFacet.class);
+                    if(facet != null) {
+                        final Class<? extends Comparator<?>> cls = facet.value();
+                        if(!Comparator.class.isAssignableFrom(cls)) {
+                            validationFailures.add("%s#%s is annotated with @SortedBy, but the class specified '%s' is not a Comparator", objectSpec.getIdentifier().getClassName(), objectCollection.getId(), facet.value().getName());
+                        }
+                    }
+                }
+                return true;
+            }
+        };
+    }
+
+    // //////////////////////////////////////
+
+    @Override
+    public void setServicesInjector(ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForInteractionAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForInteractionAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForInteractionAbstract.java
new file mode 100644
index 0000000..d601ced
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForInteractionAbstract.java
@@ -0,0 +1,97 @@
+/*
+ *  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.facets.properties.interaction;
+
+import com.google.common.base.Objects;
+import org.apache.isis.applib.services.eventbus.AbstractInteractionEvent;
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.InteractionHelper;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public abstract class PropertySetterFacetForInteractionAbstract
+        extends SingleValueFacetAbstract<Class<? extends PropertyInteractionEvent<?,?>>>
+        implements PropertySetterFacet {
+
+    public static Class<? extends Facet> type() {
+        return PropertySetterFacet.class;
+    }
+
+    private final InteractionHelper interactionHelper;
+
+    private final PropertyOrCollectionAccessorFacet getterFacet;
+    private final PropertySetterFacet setterFacet;
+    private final PropertyInteractionFacetAbstract propertyInteractionFacet;
+
+    public PropertySetterFacetForInteractionAbstract(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertySetterFacet setterFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(type(), eventType, holder);
+        this.getterFacet = getterFacet;
+        this.setterFacet = setterFacet;
+        this.propertyInteractionFacet = propertyInteractionFacet;
+        this.interactionHelper = new InteractionHelper(servicesInjector);
+    }
+
+    @Override
+    public void setProperty(ObjectAdapter targetAdapter, ObjectAdapter valueAdapter) {
+        if(setterFacet == null) {
+            return;
+        }
+        if(!interactionHelper.hasEventBusService()) {
+            setterFacet.setProperty(targetAdapter, valueAdapter);
+            return;
+        }
+
+        final Object oldValue = getterFacet.getProperty(targetAdapter);
+        setterFacet.setProperty(targetAdapter, valueAdapter);
+        final Object newValue = getterFacet.getProperty(targetAdapter);
+
+        if(Objects.equal(oldValue, newValue)) {
+            // do nothing.
+            return;
+        }
+
+        // ... and post the event (reusing existing event if available)
+        final PropertyInteractionEvent<?, ?> event = propertyInteractionFacet.currentInteraction.get();
+        interactionHelper.postEventForProperty(value(), verify(event), AbstractInteractionEvent.Phase.EXECUTE, targetAdapter, getIdentified(), oldValue, newValue);
+
+        // clean up
+        propertyInteractionFacet.currentInteraction.set(null);
+    }
+
+    /**
+     * Optional hook to allow the facet implementation for the deprecated {@link org.apache.isis.applib.annotation.PostsPropertyChangedEvent} annotation
+     * to discard the event if of a different type.
+     */
+    protected PropertyInteractionEvent<?, ?> verify(PropertyInteractionEvent<?, ?> event) {
+        return event;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPostsPropertyChangedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPostsPropertyChangedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPostsPropertyChangedEventAnnotation.java
new file mode 100644
index 0000000..8e6317c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPostsPropertyChangedEventAnnotation.java
@@ -0,0 +1,48 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PropertySetterFacetForPostsPropertyChangedEventAnnotation
+        extends PropertySetterFacetForInteractionAbstract {
+
+
+    public PropertySetterFacetForPostsPropertyChangedEventAnnotation(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertySetterFacet setterFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, getterFacet, setterFacet, propertyInteractionFacet, servicesInjector, holder);
+    }
+
+    @Override
+    protected PropertyInteractionEvent<?, ?> verify(final PropertyInteractionEvent<?, ?> event) {
+        // will discard event if different type to that specified in the PostsPropertyChangedEvent annotation.
+        return event != null && value() == event.getClass() ? event : null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionAnnotation.java
new file mode 100644
index 0000000..824cc32
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionAnnotation.java
@@ -0,0 +1,41 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PropertySetterFacetForPropertyInteractionAnnotation
+        extends PropertySetterFacetForInteractionAbstract {
+
+
+    public PropertySetterFacetForPropertyInteractionAnnotation(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertySetterFacet setterFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, getterFacet, setterFacet, propertyInteractionFacet, servicesInjector, holder);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionDefault.java
new file mode 100644
index 0000000..1869d12
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/PropertySetterFacetForPropertyInteractionDefault.java
@@ -0,0 +1,41 @@
+/*
+ *  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.facets.properties.interaction;
+
+import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class PropertySetterFacetForPropertyInteractionDefault
+        extends PropertySetterFacetForInteractionAbstract {
+
+
+    public PropertySetterFacetForPropertyInteractionDefault(
+            final Class<? extends PropertyInteractionEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final PropertySetterFacet setterFacet,
+            final PropertyInteractionFacetAbstract propertyInteractionFacet,
+            final ServicesInjector servicesInjector,
+            final FacetHolder holder) {
+        super(eventType, getterFacet, setterFacet, propertyInteractionFacet, servicesInjector, holder);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/Utils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/Utils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/Utils.java
index 11887e0..b039cac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/Utils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/interaction/Utils.java
@@ -18,41 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.properties.interaction;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.PropertyInteractionEvent;
-
 class Utils {
     private Utils(){}
-    @SuppressWarnings("unchecked")
-    public static <S,T> PropertyInteractionEvent<S,T> newEvent(
-            final Class<? extends PropertyInteractionEvent<S, T>> type,
-            final S source, 
-            final Identifier identifier,
-            final T oldValue, 
-            final T newValue) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  {
-        final Constructor<?>[] constructors = type.getConstructors();
-        for (final Constructor<?> constructor : constructors) {
-            final Class<?>[] parameterTypes = constructor.getParameterTypes();
-            if(parameterTypes.length != 4) {
-                continue;
-            }
-            if(!parameterTypes[0].isAssignableFrom(source.getClass())) {
-                continue;
-            }
-            if(!parameterTypes[1].isAssignableFrom(Identifier.class)) {
-                continue;
-            }
-            if(oldValue != null && !parameterTypes[2].isAssignableFrom(oldValue.getClass())) {
-                continue;
-            }
-            if(newValue != null && !parameterTypes[3].isAssignableFrom(newValue.getClass())) {
-                continue;
-            }
-            final Object event = constructor.newInstance(source, identifier, oldValue, newValue);
-            return (PropertyInteractionEvent<S, T>) event;
-        }
-        throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object, java.lang.Object)");
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
index 86d979f..ce0db84 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaClearMethod.java
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
@@ -63,7 +62,7 @@ public class PropertyClearFacetViaClearMethod extends PropertyClearFacetAbstract
 
     @Override
     public void clearProperty(final ObjectAdapter owningAdapter) {
-        AdapterInvokeUtils.invoke(method, owningAdapter);
+        ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
index bf2b041..856c1cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/clear/PropertyClearFacetViaSetterMethod.java
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
@@ -63,7 +62,7 @@ public class PropertyClearFacetViaSetterMethod extends PropertyClearFacetAbstrac
 
     @Override
     public void clearProperty(final ObjectAdapter owningAdapter) {
-        AdapterInvokeUtils.invoke(method, owningAdapter);
+        ObjectAdapter.InvokeUtils.invoke(method, owningAdapter);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
index 31ee0a0..badf1e6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/init/PropertyInitializationFacetViaSetterMethod.java
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
@@ -65,7 +64,7 @@ public class PropertyInitializationFacetViaSetterMethod extends PropertyInitiali
 
     @Override
     public void initProperty(final ObjectAdapter owningAdapter, final ObjectAdapter initialAdapter) {
-        AdapterInvokeUtils.invoke(method, owningAdapter, initialAdapter);
+        ObjectAdapter.InvokeUtils.invoke(method, owningAdapter, initialAdapter);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
index d728131..ddaae14 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaModifyMethod.java
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
@@ -63,7 +62,7 @@ public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstr
 
     @Override
     public void setProperty(final ObjectAdapter adapter, final ObjectAdapter valueAdapter) {
-        AdapterInvokeUtils.invoke(method, adapter, valueAdapter);
+        ObjectAdapter.InvokeUtils.invoke(method, adapter, valueAdapter);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9b90204/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
index b3b79ed..fd7d7d5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/modify/PropertySetterFacetViaSetterMethod.java
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
@@ -63,7 +62,7 @@ public class PropertySetterFacetViaSetterMethod extends PropertySetterFacetAbstr
 
     @Override
     public void setProperty(final ObjectAdapter adapter, final ObjectAdapter valueAdapter) {
-        AdapterInvokeUtils.invoke(method, adapter, valueAdapter);
+        ObjectAdapter.InvokeUtils.invoke(method, adapter, valueAdapter);
     }
 
     @Override