separation of spec and impl