finish observer pattern