this should be final to prevent people from accidentally subclassing onUpdate instead of onHandleUpdate