optimize Observer.propagate