+#include "signalproxy.h"
+
+/**
+ * This macro needs to be declared in syncable objects, next to the Q_OBJECT macro.
+ *
+ * @note: Specializations of a base syncable object for core/client must not use the macro;
+ * i.e., if you have Foo, ClientFoo and/or CoreFoo, the SYNCABLE_OBJECT macro would
+ * only be declared in the class declaration of Foo.
+ */
+#define SYNCABLE_OBJECT \
+ public: \
+ const QMetaObject *syncMetaObject() const final override { \
+ return &staticMetaObject; \
+ } \
+ private: \
+
+#define SYNC(...) sync_call__(SignalProxy::Server, __func__, __VA_ARGS__);
+#define REQUEST(...) sync_call__(SignalProxy::Client, __func__, __VA_ARGS__);
+
+#define SYNC_OTHER(x, ...) sync_call__(SignalProxy::Server, #x, __VA_ARGS__);
+#define REQUEST_OTHER(x, ...) sync_call__(SignalProxy::Client, #x, __VA_ARGS__);
+
+#define ARG(x) const_cast<void *>(reinterpret_cast<const void *>(&x))
+#define NO_ARG 0