add coroutine interface