abstracted out most things into Cup