Add event framework

Introduce the concept of events, where the existing Dbus signal
match event is one of many possible event classes.

Change-Id: I9b0c6ca12daaa109f8ceb537a5fb0cc6b5f7181b
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/events.hpp b/events.hpp
index e2a87e3..30fb24f 100644
--- a/events.hpp
+++ b/events.hpp
@@ -22,6 +22,55 @@
 using Filter = holder::CallableHolder<
     T, bool, sdbusplus::message::message&, Manager&>;
 
+/** @struct Event
+ *  @brief Event object interface.
+ */
+struct Event
+{
+    enum class Type
+    {
+        DBUS_SIGNAL,
+    };
+
+    virtual ~Event() = default;
+    Event(const Event&) = default;
+    Event& operator=(const Event&) = default;
+    Event(Event&&) = default;
+    Event& operator=(Event&&) = default;
+    explicit Event(Type t) : type(t) {}
+
+    Type type;
+};
+
+using EventBasePtr = std::shared_ptr<Event>;
+
+/** @struct DbusSignal
+ *  @brief DBus signal event.
+ *
+ *  DBus signal events are an association of a match signature
+ *  and filtering function object.
+ */
+struct DbusSignal final :
+    public Event,
+    public std::tuple<const char *, FilterBasePtr>
+{
+    virtual ~DbusSignal() = default;
+    DbusSignal(const DbusSignal&) = default;
+    DbusSignal & operator=(const DbusSignal&) = delete;
+    DbusSignal(DbusSignal&&) = default;
+    DbusSignal& operator=(DbusSignal&&) = default;
+
+    /** @brief Import from signature and filter constructor.
+     *
+     *  @param[in] sig - The DBus match signature.
+     *  @param[in] filter - A DBus signal match callback filtering function.
+     */
+    DbusSignal(const char *sig, FilterBasePtr filter) :
+        Event(Type::DBUS_SIGNAL),
+        std::tuple<const char *, FilterBasePtr>(
+                sig, std::move(filter)) {}
+};
+
 /** @brief make_filter
  *
  *  Adapt a filter function object.