private void fireVariableChangeEvent(String name, IPath value, int type) {
if (this.listeners.size() == 0)
return;
// use a separate collection to avoid interference of simultaneous additions/removals
Object[] listenerArray = this.listeners.toArray();
final PathVariableChangeEvent pve = new PathVariableChangeEvent(this, name, value, type);
for (int i = 0; i < listenerArray.length; ++i) {
final IPathVariableChangeListener l = (IPathVariableChangeListener) listenerArray[i];
ISafeRunnable job = new ISafeRunnable() {
public void handleException(Throwable exception) {
// already being logged in SafeRunner#run()