observer pattern impl
further implementation