package com.yoursway.commons.dependencies;
import java.util.ArrayList;
import java.util.Collection;
import com.yoursway.utils.bugs.Bugs;
import com.yoursway.utils.disposable.Disposable;
public class MutableValueObject extends ValueObject implements Mutable {
private final Collection<Observer> listeners = new ArrayList<Observer>();
public MutableValueObject(IdentityObject owner) {
super(owner);
alsoDispose(new Disposable() {
public void dispose() {
didChange();
}
});
}
protected final void willQuery() {
Dependencies.reading(this);
}
protected final void didChange() {
for (Observer listener : new ArrayList<Observer>(listeners))
try {
listener.observedObjectDidChange();
} catch (Throwable throwable) {
Bugs.listenerFailed(throwable, listener, "observableDidChange");
}
}
public final synchronized void subscribe(Observer listener) {
if (listener == null)
throw new NullPointerException("listener is null");
listeners.add(listener);
}
public final synchronized void unsubscribe(Observer listener) {
if (listener == null)
throw new NullPointerException("listener is null");
listeners.remove(listener);
}
}