Nit: `if (!silent && hasChanged)` is simpler. You don't need to explicitly check for boolean here since you make this param optional,