namespace AMS {
class IService {
public:
// Create or just return a singleton instance
static IService& instance();
// Destroy the singleton instance
static void destroy();
// Create a messaging domain restricted for communication
void create_domain(std::string domainName, std::string selfDesc);
// Create a subscriber for T-typed messages
template<typename T>
void create_subscriber();
// Create a publisher for T-typed messages
template<typename T>
void create_publisher();
// Subscribe a handler to T-typed messages dispatched automatically
template<typename T>
void subscribe(IHandler& handler);
// Unsubscribe from receiving T-typed messages
template<typename T>
void unsubscribe();
// Send a message to all subscribers
void send_message(IMsgObj& obj);
// Start/stop the reactor for the communication
void reactor_start();
void reactor_stop();
// Register a notifier for peer status updates within the domain
void register_discovery(IPeerNotification* notifier);
// Return the host ip address
std::string get_host_ip() const;
// Return the service logger
Poco::Logger& logger() { return *m_consoleLogger; }
// Run service in debug mode
void debug_mode() { m_consoleLogger->setLevel("debug"); }
};
} //namespace AMS