@Override
 public void clear() {
   final Collection<E> copy = Lists.newArrayList(delegate());
   super.clear();
   for (E element : copy) {
     listener.removed(element);
   }
 }
 @Override
 public boolean remove(Object object) {
   final boolean removed = super.remove(object);
   if (removed) {
     @SuppressWarnings("unchecked")
     final E element = (E) object;
     listener.removed(element);
   }
   return removed;
 }
 @Override
 public boolean retainAll(Collection<?> elements) {
   final Collection<E> copy = Lists.newArrayList(delegate());
   // this leaves all elements in copy which will be deleted in our collection
   copy.removeAll(elements);
   final boolean retained = super.retainAll(elements);
   for (E element : copy) {
     listener.removed(element);
   }
   return retained;
 }