#ifndef CLUSTER_DEVICES_MANAGER_HH
# define CLUSTER_DEVICES_MANAGER_HH

# include "utils/GlobalFactory.hh"
# include "utils/ArgList.hh"
# include "AbstractDevice.hh"

/** @brief Devices interfaces manager.
 * 
 * This singleton class manages the creation and update
 * of devices to acces the data provided by these one
 * seamlessly.
 *
 * @author Frederic Py <fpy@mbari.org>
 */
class DevicesManager {
public:
  AbstractDevice *useDevice(Symbol const &name) const;
  AbstractDevice *useDevice(Symbol const &name, ArgList const &config);

  /** @brief Update all used devices.
   *
   * This method update all the device already created using useDevice method
   */
  void update();

private:
  DevicesManager() {}
  ~DevicesManager();

  SingletonUse< GlobalFactory<AbstractDevice, std::pair<Symbol, ArgList const *> > > m_factory;
  KeyMap<AbstractDevice *> m_devices;
  std::vector<Symbol> m_update_order;

  friend class SingletonUse<DevicesManager>;

  DevicesManager(DevicesManager const &other);
}; // DevicesManager

#endif // CLUSTER_DEVICES_MANAGER_HH
