have the return type different from f return type so that we can support both T and Future[T]