add onFinish callback