observer pattern included