dynamically re-calculate results on any change