added Observer Pattern