low-level performance comment: you're looking up `variableName` in `variableWatchers` twice here when once would be sufficient. instead of calling `containsKey`, you can call `get`, and then check the answer for null. (and in the case where a new ArrayList gets created, you can just hold on to it instead of retrieving it with `get`)