separate impl/api