finished observer pattern