@Override public Object invoke(final Object collectionObject, final Method method, final Object[] args) throws Throwable { // delegate final Object returnValueObj = delegate(method, args); if (interceptedMethods.contains(method)) { resolveIfRequired(domainObject); final InteractionEvent ev = new CollectionMethodEvent(getDelegate(), getCollection().getIdentifier(), getDomainObject(), method.getName(), args, returnValueObj); notifyListeners(ev); return returnValueObj; } if (vetoedMethods.contains(method)) { throw new UnsupportedOperationException(String.format("Method '%s' may not be called directly.", method.getName())); } return returnValueObj; }