revisited Observer design pattern