hopefully finished abstraction