Complete observer pattern implementation