// -*- C++ -*-
namespace Katabatic {
/*! \class Observable
*
* \brief Observer Design Pattern, Subject part.
*
*
* Observable is the implementation of the \e subject part of the
* Observer design pattern. For the time beeing it's a simplificated
* version that allows only one Observer to watch the subject.
*
* Observable is designed to be an attribute of the subject, not one
* of it's base class.
*
* This implantation is completly generic and has nothing specific
* to Katabatic. It may be moved sometimes in Hurricane at Property
* level in Hurricane::DBo.
*
* Note to Myself: Observer pattern is the one behind signal/slots.
*/
//! \function Observable::Observable ();
//! Default and only constructor. The copy constructor is disabled
//! (made private and unimplemented).
//! \function T* Observable::getObserver ();
//! \sreturn The (only) observer, \c NULL if there is none. It is the object
//! of which the Observer is an attribute, that is, it's \e owner, and not
//! the Observer itself which is returned.
//! \function void Observable::addObserver ( BaseObserver* observer );
//! Adds an observer. If more than one is added, throw an error.
//! \function void Observable::removeObserver ( BaseObserver* observer );
//! Removes an observer. If the observer do not belong to this observable,
//! throw an exception.
//! \function void Observable::notify ( unsigned int flags );
//! Used by the subject to signal a change in it's state to the observers.
//! The \c flags parameter can be used to indicates what kind of change
//! is occuring. Values for \c flags are defined between the subject and
//! the observers.
/*! \class BaseObserver
*
* \brief Observer Design Pattern, Observer part.
*
* This class is used as a non-template base class for the templatized
* Observer one. It is used to avoid propagating template to the whole
* Observable class. It only contains the Observer::notify() virtual
* method.
*/
//! \function void BaseObserver::notify ( unsigned int flags );
//! The method which will be called whenever a change occurs on the Observable.
/*! \class Observer
*
* \brief Observer Design Pattern, Observer part.
*
* First, a warning about names: although this class is named
* Observer, it is intended to be an attribute nested inside the
* whole object which is indeed, the true Observer. This nesting object
* is called, most of the time the \b owner in the following. But
* sometimes, for simplification it may also be called the Observer.
*
* \section secImplObserver Observer Implementation Notes
*
* To retrieve the \e owner from the Observer attribute, we uses the
* offset from the attribute in the \e owner. This offset is computed
* once and for all the first time the template constructor is called.
*/
//! \function Observer::Observer ( const T* owner );
//! The owner of the oberver is needed to compute, on the first creation
//! only, the offset of the Observer attribute inside the \c owner complete
//! object.
//! \function T* Observer::getOwner () const;
//! \sreturn The owner of the observer.
}