refactored down to an interface