add isDirty()