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/05/11 19:41:57 UTC

[12/16] git commit: ISIS-550: working on ActionInvokedEvent, adding integration tests.

ISIS-550: working on ActionInvokedEvent, adding integration tests.

This is nearly there, but there is an issue with the open/close of services in the integration tests that needs addressing.


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

Branch: refs/heads/master
Commit: e1f19baaac4138800c77499cb056015101d0aa79
Parents: c2b250f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun May 11 12:08:20 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 11 12:08:20 2014 +0100

----------------------------------------------------------------------
 .../services/eventbus/ActionInvokedEvent.java   |  47 +++----
 .../eventbus/CollectionAddedToEvent.java        |  14 +-
 .../eventbus/CollectionRemovedFromEvent.java    |  13 +-
 .../services/eventbus/PropertyChangedEvent.java |  24 ++--
 .../core/metamodel/adapter/ObjectAdapter.java   |  68 +++++++++-
 .../metamodel/adapter/util/AdapterUtils.java    |  84 ++++++------
 .../event/PostsActionInvokedEventFacet.java     |  66 ++++++++++
 .../PostsActionInvokedEventFacetAbstract.java   |  44 +++++++
 .../event/PostsActionInvokedEventFacet.java     |  32 -----
 .../PostsActionInvokedEventFacetAbstract.java   |  42 ------
 .../event/PostsCollectionAddedToEventFacet.java |  37 ++++++
 ...ostsCollectionAddedToEventFacetAbstract.java |   6 +
 .../PostsCollectionRemovedFromEventFacet.java   |  38 ++++++
 ...CollectionRemovedFromEventFacetAbstract.java |   3 +
 .../event/PostsPropertyChangedEventFacet.java   |  38 ++++++
 .../PostsPropertyChangedEventFacetAbstract.java |   4 +
 .../invoke/ActionInvocationFacetViaMethod.java  |   3 -
 .../PostsActionInvokedEventFacetAnnotation.java | 112 ++++++++++++++++
 .../PostsActionInvokedEventFacetFactory.java    |   8 +-
 .../PostsActionInvokedEventFacetViaMethod.java  | 129 -------------------
 ...ctionAddedToEventAnnotationFacetFactory.java |  14 +-
 ...tsCollectionAddedToEventFacetAnnotation.java |  60 ++-------
 ...nRemovedFromEventAnnotationFacetFactory.java |  14 +-
 ...llectionRemovedFromEventFacetAnnotation.java |  58 +++------
 ...pertyChangedEventAnnotationFacetFactory.java |  23 ++--
 ...ostsPropertyChangedEventFacetAnnotation.java |  48 ++-----
 ...tionInvokedEventFacet_UtilTest_newEvent.java |  70 ++++++++++
 ...tionAddedToEventFacet_UtilTest_newEvent.java |  72 +++++++++++
 ...RemovedFromEventFacet_UtilTest_newEvent.java |  70 ++++++++++
 ...ertyChangedEventFacet_UtilTest_newEvent.java |  73 +++++++++++
 ...nAddedEventFacetAnnotationTest_newEvent.java |  53 --------
 ...emovedEventFacetAnnotationTest_newEvent.java |  52 --------
 ...hangedEventFacetAnnotationTest_newEvent.java |  52 --------
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  72 ++++++-----
 .../java/dom/todo/ToDoItemSubscriptions.java    |  59 ++++++++-
 .../java/integration/ToDoSystemInitializer.java |   2 +
 .../java/integration/tests/ToDoIntegTest.java   |   8 +-
 .../tests/actions/ToDoItemTest_completed.java   |  30 ++++-
 .../colls/ToDoItemTest_dependencies_add.java    |  24 +++-
 .../colls/ToDoItemTest_dependencies_remove.java |  27 +++-
 .../tests/props/ToDoItemTest_description.java   |  25 ++++
 .../tests/props/ToDoItemTest_notes.java         |  20 +++
 42 files changed, 1074 insertions(+), 664 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionInvokedEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionInvokedEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionInvokedEvent.java
index 7dabf9b..cbfa948 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionInvokedEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionInvokedEvent.java
@@ -18,6 +18,11 @@
  */
 package org.apache.isis.applib.services.eventbus;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.PostsActionInvokedEvent;
 import org.apache.isis.applib.util.ObjectContracts;
 
@@ -27,29 +32,28 @@ public abstract class ActionInvokedEvent<S> extends java.util.EventObject {
 
     public static class Default extends ActionInvokedEvent<Object> {
         private static final long serialVersionUID = 1L;
+        public Default(Object source, Identifier identifier, Object... arguments) {
+            super(source, identifier, arguments);
+        }
     }
 
-    private final String action;
-    private final String parameters;
-    
-    /**
-     * To instantiate reflectively when the {@link PostsActionInvokedEvent} annotation
-     * is used.
-     * 
-     * <p>
-     * The fields ({@link #source} and {@link #value} are then set reflectively.
-     */
-    public ActionInvokedEvent() {
-        this(null, null, null);
+    private final Identifier identifier;
+    private final List<Object> arguments;
+
+    public ActionInvokedEvent(
+            final S source, 
+            final Identifier identifier, 
+            final Object... arguments) {
+        this(source, identifier, arguments != null? Arrays.asList(arguments): Collections.emptyList());
     }
     
     public ActionInvokedEvent(
             final S source, 
-            final String action, 
-            final String parameters) {
+            final Identifier identifier, 
+            final List<Object> arguments) {
         super(source);
-        this.action = action;
-        this.parameters = parameters;
+        this.identifier = identifier;
+        this.arguments = Collections.unmodifiableList(arguments);
     }
     
     @Override
@@ -57,15 +61,14 @@ public abstract class ActionInvokedEvent<S> extends java.util.EventObject {
     public S getSource() {
         return (S)source;
     }
-    public String getAction() {
-        return action;
+    public Identifier getIdentifier() {
+        return identifier;
     }
-    public String getParameters() {
-        return parameters;
+    public List<Object> getArguments() {
+        return arguments;
     }
-    
     @Override
     public String toString() {
-        return ObjectContracts.toString(this, "source,action,parameters");
+        return ObjectContracts.toString(this, "source,identifier");
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionAddedToEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionAddedToEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionAddedToEvent.java
index 2b4302d..ca8f2ee 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionAddedToEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionAddedToEvent.java
@@ -28,22 +28,14 @@ public abstract class CollectionAddedToEvent<S,T> extends java.util.EventObject
 
     public static class Default extends CollectionAddedToEvent<Object, Object> {
         private static final long serialVersionUID = 1L;
+        public Default(Object source, Identifier identifier, Object value) {
+            super(source, identifier, value);
+        }
     }
 
     private final Identifier identifier;
     private final T value;
     
-    /**
-     * To instantiate reflectively when the {@link PostsPropertyChangedEvent} annotation
-     * is used.
-     * 
-     * <p>
-     * The fields ({@link #source} and {@link #value} are then set reflectively.
-     */
-    public CollectionAddedToEvent() {
-        this(null, null, null);
-    }
-    
     public CollectionAddedToEvent(
             final S source, 
             final Identifier identifier, 

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionRemovedFromEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionRemovedFromEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionRemovedFromEvent.java
index 47ff424..fb0d3ca 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionRemovedFromEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/CollectionRemovedFromEvent.java
@@ -27,21 +27,14 @@ public abstract class CollectionRemovedFromEvent<S,T> extends java.util.EventObj
 
     public static class Default extends CollectionRemovedFromEvent<Object, Object> {
         private static final long serialVersionUID = 1L;
+        public Default(Object source, Identifier identifier, Object value) {
+            super(source, identifier, value);
+        }
     }
 
     private final Identifier identifier;
     private final T value;
     
-    /**
-     * To instantiate reflectively when the {@link PostsCollectionRemovedFromEvent} annotation
-     * is used.
-     * 
-     * <p>
-     * The fields ({@link #source} and {@link #value} are then set reflectively.
-     */
-    public CollectionRemovedFromEvent() {
-        this(null, null, null);
-    }
     public CollectionRemovedFromEvent(
             final S source, 
             final Identifier identifier, 

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/PropertyChangedEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/PropertyChangedEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/PropertyChangedEvent.java
index 13666ff..a5fc83a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/PropertyChangedEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/PropertyChangedEvent.java
@@ -28,6 +28,9 @@ public abstract class PropertyChangedEvent<S,T> extends java.util.EventObject {
 
     public static class Default extends PropertyChangedEvent<Object, Object> {
         private static final long serialVersionUID = 1L;
+        public Default(Object source, Identifier identifier, Object oldValue, Object newValue) {
+            super(source, identifier, oldValue, newValue);
+        }
     }
     
     private final Identifier identifier;
@@ -35,26 +38,19 @@ public abstract class PropertyChangedEvent<S,T> extends java.util.EventObject {
     private final T newValue;
     
     /**
-     * To instantiate reflectively when the {@link PostsPropertyChangedEvent} annotation
-     * is used.
-     * 
-     * <p>
-     * The fields ({@link #source}, {@link #oldValue} and {@link #newValue}) are
-     * then set reflectively.
-     */
-    public PropertyChangedEvent() {
-        this(null, null, null, null);
-    }
-    
-    /**
      * @deprecated - use {@link #PropertyChangedEvent(Object, Identifier, Object, Object)}.
      */
     @Deprecated
-    public PropertyChangedEvent(S source, T oldValue, T newValue) {
+    public PropertyChangedEvent(
+            final S source, 
+            final T oldValue, final T newValue) {
         this(source, null, oldValue, newValue);
     }
 
-    public PropertyChangedEvent(S source, Identifier identifier, T oldValue, T newValue) {
+    public PropertyChangedEvent(
+            final S source, 
+            final Identifier identifier, 
+            final T oldValue, final T newValue) {
         super(source);
         this.identifier = identifier;
         this.oldValue = oldValue;

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index 859195f..e39f9e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -250,10 +250,36 @@ public interface ObjectAdapter extends Instance, org.apache.isis.applib.annotati
         private Util() {
         }
 
+
         public static Object unwrap(final ObjectAdapter adapter) {
             return adapter != null ? adapter.getObject() : null;
         }
 
+        public static Object[] unwrap(final ObjectAdapter[] adapters) {
+            if (adapters == null) {
+                return null;
+            }
+            final Object[] unwrappedObjects = new Object[adapters.length];
+            int i = 0;
+            for (final ObjectAdapter adapter : adapters) {
+                unwrappedObjects[i++] = unwrap(adapter);
+            }
+            return unwrappedObjects;
+        }
+
+        public static List<Object> unwrap(final List<ObjectAdapter> adapters) {
+            List<Object> objects = Lists.newArrayList();
+            for (ObjectAdapter adapter : adapters) {
+                objects.add(unwrap(adapter));
+            }
+            return objects;
+        }
+
+        @SuppressWarnings("unchecked")
+        public static <T> List<T> unwrapT(final List<ObjectAdapter> adapters) {
+            return (List<T>) unwrap(adapters);
+        }
+
         public static String unwrapAsString(final ObjectAdapter adapter) {
             final Object obj = unwrap(adapter);
             if (obj == null) {
@@ -265,13 +291,45 @@ public interface ObjectAdapter extends Instance, org.apache.isis.applib.annotati
             return (String) obj;
         }
 
+        public static String titleString(final ObjectAdapter adapter) {
+            return adapter != null ? adapter.titleString(null) : "";
+        }
 
-        public static List<Object> unwrap(final List<ObjectAdapter> adapters) {
-            List<Object> objects = Lists.newArrayList();
-            for (ObjectAdapter adapter : adapters) {
-                objects.add(unwrap(adapter));
+        public static boolean exists(final ObjectAdapter adapter) {
+            return adapter != null && adapter.getObject() != null;
+        }
+
+        public static boolean wrappedEqual(final ObjectAdapter adapter1, final ObjectAdapter adapter2) {
+            final boolean defined1 = exists(adapter1);
+            final boolean defined2 = exists(adapter2);
+            if (defined1 && !defined2) {
+                return false;
             }
-            return objects;
+            if (!defined1 && defined2) {
+                return false;
+            }
+            if (!defined1 && !defined2) {
+                return true;
+            } // both null
+            return adapter1.getObject().equals(adapter2.getObject());
+        }
+
+        public static boolean nullSafeEquals(final Object obj1, final Object obj2) {
+            if (obj1 == null && obj2 == null) {
+                return true;
+            }
+            if (obj1 == null || obj2 == null) {
+                return false;
+            }
+            if (obj1.equals(obj2)) {
+                return true;
+            }
+            if (obj1 instanceof ObjectAdapter && obj2 instanceof ObjectAdapter) {
+                final ObjectAdapter adapterObj1 = (ObjectAdapter) obj1;
+                final ObjectAdapter adapterObj2 = (ObjectAdapter) obj2;
+                return nullSafeEquals(adapterObj1.getObject(), adapterObj2.getObject());
+            }
+            return false;
         }
 
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterUtils.java
index f64013e..eb3457d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterUtils.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.adapter.util;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -28,71 +27,60 @@ public class AdapterUtils {
 
     private AdapterUtils() {
     }
-
+    
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#exists(ObjectAdapter)}
+     */
+    @Deprecated
     public static boolean exists(final ObjectAdapter adapter) {
-        return adapter != null && adapter.getObject() != null;
+        return ObjectAdapter.Util.exists(adapter);
     }
-
+    
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#wrappedEqual(ObjectAdapter, ObjectAdapter)}
+     */
+    @Deprecated
     public static boolean wrappedEqual(final ObjectAdapter adapter1, final ObjectAdapter adapter2) {
-        final boolean defined1 = exists(adapter1);
-        final boolean defined2 = exists(adapter2);
-        if (defined1 && !defined2) {
-            return false;
-        }
-        if (!defined1 && defined2) {
-            return false;
-        }
-        if (!defined1 && !defined2) {
-            return true;
-        } // both null
-        return adapter1.getObject().equals(adapter2.getObject());
+        return ObjectAdapter.Util.wrappedEqual(adapter1, adapter2);
     }
 
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#unwrap(ObjectAdapter)}
+     */
+    @Deprecated
     public static Object unwrap(final ObjectAdapter adapter) {
-        return adapter != null ? adapter.getObject() : null;
+        return ObjectAdapter.Util.unwrap(adapter);
     }
 
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#unwrap(ObjectAdapter[])}
+     */
     public static Object[] unwrap(final ObjectAdapter[] adapters) {
-        if (adapters == null) {
-            return null;
-        }
-        final Object[] unwrappedObjects = new Object[adapters.length];
-        int i = 0;
-        for (final ObjectAdapter adapter : adapters) {
-            unwrappedObjects[i++] = unwrap(adapter);
-        }
-        return unwrappedObjects;
+        return ObjectAdapter.Util.unwrap(adapters);
     }
 
-    @SuppressWarnings("unchecked")
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#unwrapT(List)}
+     */
+    @Deprecated
     public static <T> List<T> unwrap(final List<ObjectAdapter> adapters) {
-        final List<T> list = new ArrayList<T>();
-        for (final ObjectAdapter adapter : adapters) {
-            list.add((T) unwrap(adapter));
-        }
-        return list;
+        return ObjectAdapter.Util.unwrapT(adapters);
     }
 
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#titleString(ObjectAdapter)}
+     */
+    @Deprecated
     public static String titleString(final ObjectAdapter adapter) {
-        return adapter != null ? adapter.titleString() : "";
+        return ObjectAdapter.Util.titleString(adapter);
     }
 
+    /**
+     * @deprecated - use {@link ObjectAdapter.Util#nullSafeEquals(Object, Object)}
+     */
+    @Deprecated
     public static boolean nullSafeEquals(final Object obj1, final Object obj2) {
-        if (obj1 == null && obj2 == null) {
-            return true;
-        }
-        if (obj1 == null || obj2 == null) {
-            return false;
-        }
-        if (obj1.equals(obj2)) {
-            return true;
-        }
-        if (obj1 instanceof ObjectAdapter && obj2 instanceof ObjectAdapter) {
-            final ObjectAdapter adapterObj1 = (ObjectAdapter) obj1;
-            final ObjectAdapter adapterObj2 = (ObjectAdapter) obj2;
-            return nullSafeEquals(adapterObj1.getObject(), adapterObj2.getObject());
-        }
-        return false;
+        return ObjectAdapter.Util.nullSafeEquals(obj1, obj2);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacet.java
new file mode 100644
index 0000000..eefbda2
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacet.java
@@ -0,0 +1,66 @@
+/*
+ *  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.actions.event;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
+import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
+
+/**
+ * Extends the mechanism by which the action should be invoked by sending an
+ * Event to the internal Event Bus after being invoked without throwing 
+ * an Exception.
+ */
+public interface PostsActionInvokedEventFacet extends ActionInvocationFacet {
+
+    public static class Util {
+        private Util(){}
+        
+        @SuppressWarnings("unchecked")
+        public static <S> ActionInvokedEvent<S> newEvent(
+                    final Class<? extends ActionInvokedEvent<S>> type, 
+                    final S source, 
+                    final Identifier identifier, 
+                    final Object... arguments) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+            final Constructor<?>[] constructors = type.getConstructors();
+            for (final Constructor<?> constructor : constructors) {
+                final Class<?>[] parameterTypes = constructor.getParameterTypes();
+                if(parameterTypes.length != 3) {
+                    continue;
+                }
+                if(!parameterTypes[0].isAssignableFrom(source.getClass())) {
+                    continue;
+                }
+                if(!parameterTypes[1].isAssignableFrom(Identifier.class)) {
+                    continue;
+                }
+                if(!parameterTypes[2].isAssignableFrom(Object[].class)) {
+                    continue;
+                }
+                final Object event = constructor.newInstance(source, identifier, arguments);
+                return (ActionInvokedEvent<S>) event;
+            }
+            throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", [Ljava.lang.Object;)");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacetAbstract.java
new file mode 100644
index 0000000..2d74722
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/event/PostsActionInvokedEventFacetAbstract.java
@@ -0,0 +1,44 @@
+/*
+ *  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.actions.event;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
+
+public abstract class PostsActionInvokedEventFacetAbstract 
+        extends FacetAbstract 
+        implements ActionInvocationFacet {
+
+    public static Class<? extends Facet> type() {
+    	
+	    // the "primary" type is ActionInvocationFacet rather than PostsActionInvokedEventFacet
+	    // so that this facet can wrap an existing (via setUnderlying).
+	    
+        //return PostsActionInvokedEventFacetAbstract.class;
+        return ActionInvocationFacet.class;
+    }
+
+    public PostsActionInvokedEventFacetAbstract(final FacetHolder holder) {
+        super(type(), holder, Derivation.NOT_DERIVED);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacet.java
deleted file mode 100644
index 8f9d070..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacet.java
+++ /dev/null
@@ -1,32 +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.actions.invoke.event;
-
-import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
-
-/**
- * Extends the mechanism by which the action should be invoked by sending an
- * Event to the internal Event Bus after being invoked without throwing 
- * an Exception.
- * 
- */
-public interface PostsActionInvokedEventFacet extends ActionInvocationFacet {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAbstract.java
deleted file mode 100644
index 8a0115f..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAbstract.java
+++ /dev/null
@@ -1,42 +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.actions.invoke.event;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
-
-public abstract class PostsActionInvokedEventFacetAbstract extends FacetAbstract implements ActionInvocationFacet {
-
-    public static Class<? extends Facet> type() {
-    	
-	    // the "primary" type is ActionInvocationFacet rather than PostsActionInvokedEventFacet
-	    // so that this facet can wrap an existing (via setUnderlying).
-	    
-        //return PostsActionInvokedEventFacetAbstract.class;
-        return ActionInvocationFacet.class;
-    }
-
-    public PostsActionInvokedEventFacetAbstract(final FacetHolder holder) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacet.java
index f437667..f64aa8d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacet.java
@@ -19,8 +19,13 @@
 
 package org.apache.isis.core.metamodel.facets.collections.event;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
 import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.SingleValueFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
@@ -30,5 +35,37 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToF
  * {@link EventBusService}.
  */
 public interface PostsCollectionAddedToEventFacet extends SingleValueFacet<Class<? extends CollectionAddedToEvent<?,?>>>, CollectionAddToFacet, MultiTypedFacet {
+    
+    public static class Util {
+        private Util(){}
+        
+        @SuppressWarnings("unchecked")
+        public static <S, T> CollectionAddedToEvent<S, T> newEvent(
+                final Class<? extends CollectionAddedToEvent<S, T>> type,
+                final S source, 
+                final Identifier identifier,
+                final T value) 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 != 3) {
+                    continue;
+                }
+                if(!parameterTypes[0].isAssignableFrom(source.getClass())) {
+                    continue;
+                }
+                if(!parameterTypes[1].isAssignableFrom(Identifier.class)) {
+                    continue;
+                }
+                if(value != null && !parameterTypes[2].isAssignableFrom(value.getClass())) {
+                    continue;
+                }
+                final Object event = constructor.newInstance(source, identifier, value);
+                return (CollectionAddedToEvent<S, T>) event;
+            }
+            throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object)");
+        }
+
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacetAbstract.java
index 7423a41..57a1618 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionAddedToEventFacetAbstract.java
@@ -19,7 +19,12 @@
 
 package org.apache.isis.core.metamodel.facets.collections.event;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
+import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
@@ -45,4 +50,5 @@ public abstract class PostsCollectionAddedToEventFacetAbstract
         super(type(), changedEventType, holder);
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacet.java
index 90a657b..18ff1b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacet.java
@@ -19,6 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.collections.event;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.CollectionRemovedFromEvent;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
@@ -30,5 +34,39 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemove
  * {@link EventBusService}.
  */
 public interface PostsCollectionRemovedFromEventFacet extends SingleValueFacet<Class<? extends CollectionRemovedFromEvent<?,?>>>, CollectionRemoveFromFacet, MultiTypedFacet {
+
+
+    public static class Util {
+        private Util(){}
+
+        @SuppressWarnings("unchecked")
+        public static <S, T> CollectionRemovedFromEvent<S, T> newEvent(
+                final Class<? extends CollectionRemovedFromEvent<S, T>> type,
+                        final S source, 
+                        final Identifier identifier, 
+                        final T value) 
+                                throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+            final Constructor<?>[] constructors = type.getConstructors();
+            for (final Constructor<?> constructor : constructors) {
+                final Class<?>[] parameterTypes = constructor.getParameterTypes();
+                if(parameterTypes.length != 3) {
+                    continue;
+                }
+                if(!parameterTypes[0].isAssignableFrom(source.getClass())) {
+                    continue;
+                }
+                if(!parameterTypes[1].isAssignableFrom(Identifier.class)) {
+                    continue;
+                }
+                if(value != null && !parameterTypes[2].isAssignableFrom(value.getClass())) {
+                    continue;
+                }
+                final Object event = constructor.newInstance(source, identifier, value);
+                return (CollectionRemovedFromEvent<S, T>) event;
+            }
+            throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object)");
+        }
+    }
+
 }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAbstract.java
index 18fc423..ed1e0a4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAbstract.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.collections.event;
 
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.CollectionRemovedFromEvent;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
index a01e7f4..a7d3fd5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacet.java
@@ -19,6 +19,11 @@
 
 package org.apache.isis.core.metamodel.facets.properties.event;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
@@ -32,4 +37,37 @@ import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFac
  */
 public interface PostsPropertyChangedEventFacet extends SingleValueFacet<Class<? extends PropertyChangedEvent<?,?>>>, PropertyClearFacet, PropertySetterFacet, MultiTypedFacet {
 
+    public static class Util {
+        private Util(){}
+        @SuppressWarnings("unchecked")
+        public static <S,T> PropertyChangedEvent<S,T> newEvent(
+                final Class<? extends PropertyChangedEvent<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 (PropertyChangedEvent<S, T>) event;
+            }
+            throw new NoSuchMethodException(type.getName()+".<init>(? super " + source.getClass().getName() + ", " + Identifier.class.getName() + ", java.lang.Object, java.lang.Object)");
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
index 1acbf8d..968d4ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/event/PostsPropertyChangedEventFacetAbstract.java
@@ -19,6 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.properties.event;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
index 4f9dfbf..e9956d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/ActionInvocationFacetViaMethod.java
@@ -162,9 +162,6 @@ public class ActionInvocationFacetViaMethod extends ActionInvocationFacetAbstrac
 		public ObjectAdapter getAdapter() {
 			return adapter;
 		}
-
-
-    	
     }
     
     protected InvocationResult internalInvoke(

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAnnotation.java
new file mode 100644
index 0000000..db1155f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetAnnotation.java
@@ -0,0 +1,112 @@
+/*
+ *  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.progmodel.facets.actions.invoke.event;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.apache.isis.applib.FatalException;
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
+import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
+import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.actions.event.PostsActionInvokedEventFacet;
+import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod;
+
+public class PostsActionInvokedEventFacetAnnotation 
+        extends ActionInvocationFacetViaMethod 
+        implements ImperativeFacet, PostsActionInvokedEventFacet {
+	
+	private ServicesInjector servicesInjector;
+	private Class<? extends ActionInvokedEvent<?>> eventType;
+
+	private EventBusService eventBusService;
+	private boolean searchedForEventBusService = false;
+	
+    public PostsActionInvokedEventFacetAnnotation(
+            final Method method, 
+            final ObjectSpecification onType, 
+            final ObjectSpecification returnType, 
+            final FacetHolder holder, 
+            final RuntimeContext runtimeContext, 
+            final AdapterManager adapterManager, 
+            final ServicesInjector servicesInjector,
+			final Class<? extends ActionInvokedEvent<?>> eventType) {
+        super(method, onType, returnType, holder, runtimeContext, adapterManager, servicesInjector);
+        
+        this.servicesInjector = servicesInjector;
+        
+        this.eventType = eventType;
+    }
+
+    @Override
+    public ObjectAdapter invoke(
+            final ObjectAction owningAction, 
+            final ObjectAdapter targetAdapter, 
+            final ObjectAdapter[] arguments) {
+
+    	final InvocationResult invocationResult = this.internalInvoke(owningAction, targetAdapter, arguments);
+    	
+    	// Perhaps the Action was not properly invoked (i.e. an exception was raised).
+    	if (invocationResult.getWhetherInvoked()) {
+    		// If invoked, then send the ActionInvokedEvent to the EventBus.
+    		postEvent(owningAction, targetAdapter, arguments);
+    	}
+    	
+    	return invocationResult.getAdapter();
+    }
+    
+	@SuppressWarnings({ "rawtypes" })
+	private void postEvent(
+            final ObjectAction owningAction, 
+            final ObjectAdapter targetAdapter, 
+            final ObjectAdapter[] argumentAdapters) {
+	    
+		try {
+			final Class type = eventType;
+			Identifier actionIdentifier = owningAction.getIdentifier();
+	        final Object source = AdapterUtils.unwrap(targetAdapter);
+			final Object[] arguments = AdapterUtils.unwrap(argumentAdapters);
+            @SuppressWarnings("unchecked")
+            final ActionInvokedEvent<?> event = org.apache.isis.core.metamodel.facets.actions.event.PostsActionInvokedEventFacet.Util.newEvent(type, source, actionIdentifier, arguments);
+			getEventBusService().post(event);
+		} catch (Exception e) {
+			throw new FatalException(e);
+		}
+	}
+
+	private EventBusService getEventBusService() {
+		if (!searchedForEventBusService) {
+			eventBusService = this.servicesInjector.lookupService(EventBusService.class);
+		}
+		searchedForEventBusService = true;
+		return eventBusService;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetFactory.java
index e46e7cc..d52b55a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetFactory.java
@@ -21,7 +21,9 @@ package org.apache.isis.core.progmodel.facets.actions.invoke.event;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.applib.annotation.PostsActionInvokedEvent;
 import org.apache.isis.applib.annotation.PostsCollectionAddedToEvent;
+import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
 import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
@@ -97,7 +99,7 @@ public class PostsActionInvokedEventFacetFactory extends MethodPrefixBasedFacetF
         final Method actionMethod = processMethodContext.getMethod();
 
         try {
-            final PostsCollectionAddedToEvent annotation = Annotations.getAnnotation(actionMethod, PostsCollectionAddedToEvent.class);
+            final PostsActionInvokedEvent annotation = Annotations.getAnnotation(actionMethod, PostsActionInvokedEvent.class);
             if(annotation == null) {
                 return;
             }
@@ -112,9 +114,9 @@ public class PostsActionInvokedEventFacetFactory extends MethodPrefixBasedFacetF
             final ObjectSpecification typeSpec = getSpecificationLoader().loadSpecification(cls);
             final FacetHolder holder = processMethodContext.getFacetHolder();
             
-            final Class<? extends CollectionAddedToEvent<?,?>> changedEventType = annotation.value();
+            final Class<? extends ActionInvokedEvent<?>> changedEventType = annotation.value();
 
-            FacetUtil.addFacet(new PostsActionInvokedEventFacetViaMethod(actionMethod, typeSpec, returnSpec, holder, getRuntimeContext(), getAdapterManager(), getServicesInjector(), changedEventType));
+            FacetUtil.addFacet(new PostsActionInvokedEventFacetAnnotation(actionMethod, typeSpec, returnSpec, holder, getRuntimeContext(), getAdapterManager(), getServicesInjector(), changedEventType));
         } finally {
             processMethodContext.removeMethod(actionMethod);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetViaMethod.java
deleted file mode 100644
index 16f2fb7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/invoke/event/PostsActionInvokedEventFacetViaMethod.java
+++ /dev/null
@@ -1,129 +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.progmodel.facets.actions.invoke.event;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-import org.apache.isis.applib.FatalException;
-import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
-import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod;
-
-public class PostsActionInvokedEventFacetViaMethod extends ActionInvocationFacetViaMethod implements ImperativeFacet {
-	
-	private EventBusService eventBusService;
-	private boolean searchedForEventBusService = false;
-	private ServicesInjector servicesInjector;
-	private Class<? extends CollectionAddedToEvent<?, ?>> eventType;
-
-    public PostsActionInvokedEventFacetViaMethod(
-            final Method method, 
-            final ObjectSpecification onType, 
-            final ObjectSpecification returnType, 
-            final FacetHolder holder, 
-            final RuntimeContext runtimeContext, 
-            final AdapterManager adapterManager, 
-            final ServicesInjector servicesInjector,
-			final Class<? extends CollectionAddedToEvent<?, ?>> eventType) {
-        super(method, onType, returnType, holder, runtimeContext, adapterManager, servicesInjector);
-        
-        // Also needed here.
-        this.servicesInjector = servicesInjector;
-        
-        this.eventType = eventType;
-    }
-
-    @Override
-    public ObjectAdapter invoke(
-            final ObjectAction owningAction, 
-            final ObjectAdapter targetAdapter, 
-            final ObjectAdapter[] arguments) {
-
-    	final InvocationResult invocationResult = this.internalInvoke(owningAction, targetAdapter, arguments);
-    	
-    	// Perhaps the Action was not properly invoked (i.e. an exception was raised).
-    	if (invocationResult.getWhetherInvoked()) {
-    		// If invoked, then send the ActionInvokedEvent to the EventBus.
-    		postEvent(owningAction, targetAdapter, arguments);
-    	}
-    	
-    	return invocationResult.getAdapter();
-    	
-    }
-    
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	private void postEvent(
-            final ObjectAction owningAction, 
-            final ObjectAdapter targetAdapter, 
-            final ObjectAdapter[] arguments) {
-	    
-		final Object source = targetAdapter.getObject();
-		try {
-			final Class type = eventType;
-			final ActionInvokedEvent event = newEvent(type, owningAction, source, arguments);
-			getEventBusService().post(event);
-		} catch (Exception e) {
-			throw new FatalException(e);
-		}
-	}
-
-	static <S> ActionInvokedEvent<S> newEvent(
-			final Class<? extends ActionInvokedEvent<S>> type,
-		            final ObjectAction owningAction, 
-		            final S source, 
-		            final ObjectAdapter[] arguments)
-			throws InstantiationException, IllegalAccessException,
-			NoSuchFieldException {
-		final ActionInvokedEvent<S> event = type.newInstance();
-
-		setField("owningAction", event, owningAction);
-		setField("targetAdapter", event, source);
-		setField("arguments", event, arguments.toString());
-		return event;
-	}
-
-	private static void setField(final String name,
-			final ActionInvokedEvent<?> event, final Object sourceValue)
-			throws NoSuchFieldException, IllegalAccessException {
-		final Field sourceField = CollectionAddedToEvent.class
-				.getDeclaredField(name);
-		sourceField.setAccessible(true);
-		sourceField.set(event, sourceValue);
-	}
-
-	private EventBusService getEventBusService() {
-		if (!searchedForEventBusService) {
-			eventBusService = this.servicesInjector.lookupService(EventBusService.class);
-		}
-		searchedForEventBusService = true;
-		return eventBusService;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventAnnotationFacetFactory.java
index 5292f07..d59a07a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventAnnotationFacetFactory.java
@@ -33,10 +33,12 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.collections.event.PostsCollectionAddedToEventFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 
-public class PostsCollectionAddedToEventAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesProviderAware {
+public class PostsCollectionAddedToEventAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware {
 
-    private ServicesProvider servicesProvider;
+    private ServicesInjector servicesInjector;
 
     public PostsCollectionAddedToEventAnnotationFacetFactory() {
         super(FeatureType.COLLECTIONS_ONLY);
@@ -65,12 +67,14 @@ public class PostsCollectionAddedToEventAnnotationFacetFactory extends FacetFact
         // the collectionAddToFacet will end up as the underlying facet of the PostsCollectionAddedToEventFacetAnnotation
 
         final Class<? extends CollectionAddedToEvent<?,?>> changedEventType = annotation.value();
-        return new PostsCollectionAddedToEventFacetAnnotation(changedEventType, getterFacet, collectionAddToFacet, servicesProvider, holder);
+        return new PostsCollectionAddedToEventFacetAnnotation(changedEventType, getterFacet, collectionAddToFacet, servicesInjector, holder);
     }
 
+    // //////////////////////////////////////
+
     @Override
-    public void setServicesProvider(ServicesProvider servicesProvider) {
-        this.servicesProvider = servicesProvider;
+    public void setServicesInjector(ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventFacetAnnotation.java
index e566300..e093b44 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionAddedToEventFacetAnnotation.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.core.progmodel.facets.collections.event;
 
-import java.lang.reflect.Field;
-import java.util.List;
 import java.util.Set;
 
 import com.google.common.collect.Lists;
@@ -30,7 +28,6 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -38,13 +35,14 @@ import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccess
 import org.apache.isis.core.metamodel.facets.collections.event.PostsCollectionAddedToEventFacet;
 import org.apache.isis.core.metamodel.facets.collections.event.PostsCollectionAddedToEventFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 
 public class PostsCollectionAddedToEventFacetAnnotation 
         extends PostsCollectionAddedToEventFacetAbstract {
 
     private final PropertyOrCollectionAccessorFacet getterFacet;
 	private final CollectionAddToFacet collectionAddToFacet;
-	private final ServicesProvider servicesProvider;
+	private final ServicesInjector servicesInjector;
 
 	private EventBusService eventBusService;
 	private boolean searchedForEventBusService = false;
@@ -53,12 +51,12 @@ public class PostsCollectionAddedToEventFacetAnnotation
 			final Class<? extends CollectionAddedToEvent<?, ?>> eventType,
 			final PropertyOrCollectionAccessorFacet getterFacet,
 			final CollectionAddToFacet collectionAddToFacet,
-			final ServicesProvider servicesProvider, 
+		    final ServicesInjector servicesInjector,
 			final FacetHolder holder) {
 		super(eventType, holder);
         this.getterFacet = getterFacet;
 		this.collectionAddToFacet = collectionAddToFacet;
-		this.servicesProvider = servicesProvider;
+		this.servicesInjector = servicesInjector;
 	}
 
 	@Override
@@ -97,55 +95,23 @@ public class PostsCollectionAddedToEventFacetAnnotation
             final Identifier identifier,
 			final Object addedReference) {
 	    
-		final Object source = targetAdapter.getObject();
 		try {
 			final Class type = value();
-			final CollectionAddedToEvent<?, ?> event = newEvent(type, source, identifier, addedReference);
+            final Object source = AdapterUtils.unwrap(targetAdapter);
+			final CollectionAddedToEvent<?, ?> event = Util.newEvent(type, source, identifier, addedReference);
 			eventBusService.post(event);
 		} catch (Exception e) {
 			throw new FatalException(e);
 		}
 	}
 
-	static <S, T> CollectionAddedToEvent<S, T> newEvent(
-			final Class<? extends CollectionAddedToEvent<S, T>> type,
-			final S source, 
-			final Identifier identifier,
-			final T value)
-			throws InstantiationException, IllegalAccessException,
-			NoSuchFieldException {
-		final CollectionAddedToEvent<S, T> event = type.newInstance();
-
-		setField("source", event, source);
-		setField("identifier", event, identifier);
-		setField("value", event, value);
-		return event;
-	}
-
-	private static void setField(final String name,
-			final CollectionAddedToEvent<?, ?> event, final Object sourceValue)
-			throws NoSuchFieldException, IllegalAccessException {
-		final Field sourceField = CollectionAddedToEvent.class
-				.getDeclaredField(name);
-		sourceField.setAccessible(true);
-		sourceField.set(event, sourceValue);
-	}
-
-	private EventBusService getEventBusService() {
-		if (!searchedForEventBusService) {
-			final List<ObjectAdapter> serviceAdapters = servicesProvider
-					.getServices();
-			for (ObjectAdapter serviceAdapter : serviceAdapters) {
-				final Object service = serviceAdapter.getObject();
-				if (service instanceof EventBusService) {
-					eventBusService = (EventBusService) service;
-					break;
-				}
-			}
-		}
-		searchedForEventBusService = true;
-		return eventBusService;
-	}
+    private EventBusService getEventBusService() {
+        if (!searchedForEventBusService) {
+            eventBusService = this.servicesInjector.lookupService(EventBusService.class);
+        }
+        searchedForEventBusService = true;
+        return eventBusService;
+    }
 
 	// //////////////////////////////////////
 	// MultiTypedFacet

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventAnnotationFacetFactory.java
index abf039c..c8b8ffa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventAnnotationFacetFactory.java
@@ -33,10 +33,12 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.collections.event.PostsCollectionRemovedFromEventFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 
-public class PostsCollectionRemovedFromEventAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesProviderAware {
+public class PostsCollectionRemovedFromEventAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware {
 
-    private ServicesProvider servicesProvider;
+    private ServicesInjector servicesInjector;
 
     public PostsCollectionRemovedFromEventAnnotationFacetFactory() {
         super(FeatureType.COLLECTIONS_ONLY);
@@ -65,12 +67,14 @@ public class PostsCollectionRemovedFromEventAnnotationFacetFactory extends Facet
         // the collectionRemoveFromFacet will end up as the underlying facet of the PostsCollectionRemovedFromEventFacetAnnotation
 
         final Class<? extends CollectionRemovedFromEvent<?,?>> changedEventType = annotation.value();
-        return new PostsCollectionRemovedFromEventFacetAnnotation(changedEventType, getterFacet, collectionRemoveFromFacet, servicesProvider, holder);
+        return new PostsCollectionRemovedFromEventFacetAnnotation(changedEventType, getterFacet, collectionRemoveFromFacet, servicesInjector, holder);
     }
 
+    // //////////////////////////////////////
+
     @Override
-    public void setServicesProvider(ServicesProvider servicesProvider) {
-        this.servicesProvider = servicesProvider;
+    public void setServicesInjector(ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAnnotation.java
index 98524cf..0cd48c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/collections/event/PostsCollectionRemovedFromEventFacetAnnotation.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.progmodel.facets.collections.event;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.List;
 
@@ -38,13 +39,14 @@ import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccess
 import org.apache.isis.core.metamodel.facets.collections.event.PostsCollectionRemovedFromEventFacet;
 import org.apache.isis.core.metamodel.facets.collections.event.PostsCollectionRemovedFromEventFacetAbstract;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 
 public class PostsCollectionRemovedFromEventFacetAnnotation extends
 		PostsCollectionRemovedFromEventFacetAbstract {
 
 	private final PropertyOrCollectionAccessorFacet getterFacet;
 	private final CollectionRemoveFromFacet collectionRemoveFromFacet;
-	private final ServicesProvider servicesProvider;
+    private final ServicesInjector servicesInjector;
 
 	private EventBusService eventBusService;
 	private boolean searchedForEventBusService = false;
@@ -53,11 +55,12 @@ public class PostsCollectionRemovedFromEventFacetAnnotation extends
 			final Class<? extends CollectionRemovedFromEvent<?, ?>> eventType,
 			final PropertyOrCollectionAccessorFacet getterFacet,
 			final CollectionRemoveFromFacet collectionRemoveFromFacet,
-			final ServicesProvider servicesProvider, final FacetHolder holder) {
+            final ServicesInjector servicesInjector,
+			final FacetHolder holder) {
 		super(eventType, holder);
 		this.getterFacet = getterFacet;
 		this.collectionRemoveFromFacet = collectionRemoveFromFacet;
-		this.servicesProvider = servicesProvider;
+        this.servicesInjector = servicesInjector;
 	}
 
 	@Override
@@ -96,54 +99,23 @@ public class PostsCollectionRemovedFromEventFacetAnnotation extends
 	private void postEvent(final ObjectAdapter targetAdapter,
 			final Identifier identifier, final Object removedReference) {
 
-		final Object source = targetAdapter.getObject();
 		try {
 			final Class type = value();
-			final CollectionRemovedFromEvent<?, ?> event = newEvent(type, source,
-					identifier, removedReference);
+			final Object source = AdapterUtils.unwrap(targetAdapter);
+			final CollectionRemovedFromEvent<?, ?> event = Util.newEvent(type, source, identifier, removedReference);
 			eventBusService.post(event);
 		} catch (Exception e) {
 			throw new FatalException(e);
 		}
 	}
 
-	static <S, T> CollectionRemovedFromEvent<S, T> newEvent(
-			final Class<? extends CollectionRemovedFromEvent<S, T>> type,
-			final S source, final Identifier identifier, final T value)
-			throws InstantiationException, IllegalAccessException,
-			NoSuchFieldException {
-		final CollectionRemovedFromEvent<S, T> event = type.newInstance();
-
-		setField("source", event, source);
-		setField("identifier", event, identifier);
-		setField("value", event, value);
-		return event;
-	}
-
-	private static void setField(final String name,
-			final CollectionRemovedFromEvent<?, ?> event, final Object sourceValue)
-			throws NoSuchFieldException, IllegalAccessException {
-		final Field sourceField = CollectionRemovedFromEvent.class
-				.getDeclaredField(name);
-		sourceField.setAccessible(true);
-		sourceField.set(event, sourceValue);
-	}
-
-	private EventBusService getEventBusService() {
-		if (!searchedForEventBusService) {
-			final List<ObjectAdapter> serviceAdapters = servicesProvider
-					.getServices();
-			for (ObjectAdapter serviceAdapter : serviceAdapters) {
-				final Object service = serviceAdapter.getObject();
-				if (service instanceof EventBusService) {
-					eventBusService = (EventBusService) service;
-					break;
-				}
-			}
-		}
-		searchedForEventBusService = true;
-		return eventBusService;
-	}
+    private EventBusService getEventBusService() {
+        if (!searchedForEventBusService) {
+            eventBusService = this.servicesInjector.lookupService(EventBusService.class);
+        }
+        searchedForEventBusService = true;
+        return eventBusService;
+    }
 
 	// //////////////////////////////////////
 	// MultiTypedFacet

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
index 030a5b3..89bd745 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventAnnotationFacetFactory.java
@@ -39,6 +39,8 @@ import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
 import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventFacet;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.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;
@@ -47,9 +49,9 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVis
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
-public class PostsPropertyChangedEventAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesProviderAware, MetaModelValidatorRefiner {
+public class PostsPropertyChangedEventAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware, MetaModelValidatorRefiner {
 
-    private ServicesProvider servicesProvider;
+    private ServicesInjector servicesInjector;
 
     public PostsPropertyChangedEventAnnotationFacetFactory() {
         super(FeatureType.PROPERTIES_ONLY);
@@ -89,14 +91,11 @@ public class PostsPropertyChangedEventAnnotationFacetFactory extends FacetFactor
         }
         
         final Class<? extends PropertyChangedEvent<?, ?>> changedEventType = annotation.value();
-        return new PostsPropertyChangedEventFacetAnnotation(changedEventType, getterFacet, setterFacet, clearFacet, servicesProvider, holder);
-    }
-
-    @Override
-    public void setServicesProvider(ServicesProvider servicesProvider) {
-        this.servicesProvider = servicesProvider;
+        return new PostsPropertyChangedEventFacetAnnotation(changedEventType, getterFacet, setterFacet, clearFacet, servicesInjector, holder);
     }
 
+    // //////////////////////////////////////
+    
     @Override
     public void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator, IsisConfiguration configuration) {
         metaModelValidator.add(new MetaModelValidatorVisiting(newValidatorVisitor()));
@@ -122,4 +121,12 @@ public class PostsPropertyChangedEventAnnotationFacetFactory extends FacetFactor
         };
     }
 
+    // //////////////////////////////////////
+
+    @Override
+    public void setServicesInjector(ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
+    }
+
+    
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e1f19baa/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
index 017cf48..db67de1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/event/PostsPropertyChangedEventFacetAnnotation.java
@@ -19,7 +19,9 @@
 
 package org.apache.isis.core.progmodel.facets.properties.event;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 
 import com.google.common.base.Objects;
@@ -31,6 +33,7 @@ import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ServicesProvider;
+import org.apache.isis.core.metamodel.adapter.util.AdapterUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet;
@@ -38,13 +41,14 @@ import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChang
 import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventFacetAbstract;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 
 public class PostsPropertyChangedEventFacetAnnotation extends PostsPropertyChangedEventFacetAbstract {
 
     private final PropertyOrCollectionAccessorFacet getterFacet;
     private final PropertySetterFacet setterFacet;
     private final PropertyClearFacet clearFacet;
-    private final ServicesProvider servicesProvider;
+    private final ServicesInjector servicesInjector;
     
     private EventBusService eventBusService;
     private boolean searchedForEventBusService = false;
@@ -54,13 +58,13 @@ public class PostsPropertyChangedEventFacetAnnotation extends PostsPropertyChang
             final PropertyOrCollectionAccessorFacet getterFacet, 
             final PropertySetterFacet setterFacet, 
             final PropertyClearFacet clearFacet, 
-            final ServicesProvider servicesProvider, 
+            final ServicesInjector servicesInjector,
             final FacetHolder holder) {
         super(eventType, holder);
         this.getterFacet = getterFacet;
         this.setterFacet = setterFacet;
         this.clearFacet = clearFacet;
-        this.servicesProvider = servicesProvider;
+        this.servicesInjector = servicesInjector;
     }
 
     @Override
@@ -110,10 +114,10 @@ public class PostsPropertyChangedEventFacetAnnotation extends PostsPropertyChang
             // do nothing.
             return;
         }
-        final Object source = targetAdapter.getObject();
         try {
             final Class type = value();
-            final PropertyChangedEvent<?, ?> event = newEvent(type, source, identifier, oldValue, newValue);
+            final Object source = ObjectAdapter.Util.unwrap(targetAdapter);
+            final PropertyChangedEvent<?, ?> event = Util.newEvent(type, source, identifier, oldValue, newValue);
             
             eventBusService.post(event);
         } catch (Exception e) {
@@ -121,38 +125,10 @@ public class PostsPropertyChangedEventFacetAnnotation extends PostsPropertyChang
         }
     }
 
-    static <S,T> PropertyChangedEvent<S,T> newEvent(
-            final Class<? extends PropertyChangedEvent<S, T>> type, 
-            final S source, 
-            final Identifier identifier,
-            final T oldValue, 
-            final T newValue) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
-        final PropertyChangedEvent<S, T> event = type.newInstance();
-        
-        setField("source", event, source);
-        setField("identifier", event, identifier);
-        setField("oldValue", event, oldValue);
-        setField("newValue", event, newValue);
-        return event;
-    }
-
-    private static void setField(final String name, final PropertyChangedEvent<?, ?> event, final Object sourceValue) throws NoSuchFieldException, IllegalAccessException {
-        final Field sourceField = PropertyChangedEvent.class.getDeclaredField(name);
-        sourceField.setAccessible(true);
-        sourceField.set(event, sourceValue);
-    }
-    
     private EventBusService getEventBusService() {
-        if(!searchedForEventBusService) {
-            final List<ObjectAdapter> serviceAdapters = servicesProvider.getServices();
-            for (ObjectAdapter serviceAdapter : serviceAdapters) {
-                final Object service = serviceAdapter.getObject();
-                if(service instanceof EventBusService) {
-                    eventBusService = (EventBusService) service;
-                    break;
-                }
-            }
-        } 
+        if (!searchedForEventBusService) {
+            eventBusService = this.servicesInjector.lookupService(EventBusService.class);
+        }
         searchedForEventBusService = true;
         return eventBusService;
     }