add attribute change callback