implement enter() exit() update() pattern