Refactor to allow additional implementations