bool T::Register(T##Id id, T##Creator c, const char *name) { \
DBG(#T "::Register(..., %s)\n", name); \
} \
T* T::create(const char* name) { return T::create(T::id(name));} \
T##Id* T::next(T##Id *id) { \
if (!id) return (T##Id*)&ids[0]; \
T##Id *id0 = (T##Id*)&ids[0], *id1 = (T##Id*)&ids[ids.size() - 1]; \
if (id >= id0 && id < id1) return id + 1; \
if (id == id1) return NULL; \
std::vector<T##Id>::const_iterator it = std::find(ids.begin(), ids.end(), *id); \
if (it == ids.end()) return NULL; \
return (T##Id*)&*(it++); \
} \
T##Id T::id(const char* name) { DBG(#T "::id(\"%s\")\n", name); return T##Factory::Instance().id(name, false);} \
const char* T::name(T##Id id) {return T##Factory::Instance().name(id);}
static Class & Instance()