add promise support (wip)