isDirty now observed on attribute change