import java.util.*;

public aspect Observer {
    public interface UseObserverAspect {}
    
    private Vector UseObserverAspect.subscribers = new Vector();

    after() returning(Object cloned): call(Object UseObserverAspect.clone()) {
        UseObserverAspect ret = (UseObserverAspect)cloned; 
        ret.subscribers = (Vector)ret.subscribers.clone();
    }


    public pointcut update_needed() :
        execution(void enterFlight(Flight));

    after(UseObserverAspect o) returning(): target(o) && update_needed() {
        o.publish();
    }

    public void UseObserverAspect.subscribe(IObserver o) {
        subscribers.add(o);
    }

    public void UseObserverAspect.publish() {
        for (int i = 0; i < subscribers.size(); i++) {
            ((IObserver)subscribers.elementAt(i)).update(this);
        }
    }
    
}
