this should probably call dirty()