observer pattern added