shuffle some code out of Agent and into Observer