introduced observer pattern