Refactor warpable protocol to make it simpler to implement