add onUpdate callback