#define PROPERTY_(TYPE, NAME, BINDING_OR_OBSERVER1, BINDING_OR_OBSERVER2) \
private:\
FIELD(private, TYPE, m_##NAME);\
TYPE get_##NAME() const {\
return m_##NAME;\
}\
void set_##NAME(TYPE value) {\
m_##NAME = value;\
}\
BINDING_OR_OBSERVER1##_BINDING_PROPERTY_DEFAULT(TYPE, NAME)\
BINDING_OR_OBSERVER2##_BINDING_PROPERTY_DEFAULT(TYPE, NAME)\
\
NET_PROPERTY(TYPE, NAME, BINDING_OR_OBSERVER1##_OBSERVER_PROPERTY_DEFAULT(TYPE, NAME), BINDING_OR_OBSERVER2##_OBSERVER_PROPERTY_DEFAULT(TYPE, NAME))
#define _BINDING_PROPERTY_DEFAULT(TYPE, NAME) // nothing
#define lua_BINDING_PROPERTY_DEFAULT(TYPE, NAME) LUA_DEFAULT_PROPERTY(TYPE, NAME)
#define net_BINDING_PROPERTY_DEFAULT(TYPE, NAME) // nothing
#define _OBSERVER_PROPERTY_DEFAULT(TYPE, NAME) // nothing
#define lua_OBSERVER_PROPERTY_DEFAULT(TYPE, NAME) // nothing
#define net_OBSERVER_PROPERTY_DEFAULT(TYPE, NAME) m_observers.push_back(new network_observer<TYPE>());
Some kind of spezialization.