implement dirty checking