object change listener infrastructure