added observable/observer patterns