more efficient mutation listener