More flexible success/fail/done promise system