add finish callback