use a common object for state (can't live in factories or protocols which are ephemeral)