add is_dirty() helper