+ std::string GetObjectName() const \
+ { \
+ return std::string(BBTK_STRINGIFY(CLASS)) \
+ +std::string("Descriptor<")+bbtk::TypeName<T1>() \
+ +std::string(",")+bbtk::TypeName<T2>() \
+ +std::string("> '")+GetFullTypeName() \
+ +std::string("'"); \
+ } \
+ static Pointer New() \
+ { \
+ bbtkDebugMessage("object",1,"##> "<<BBTK_STRINGIFY(CLASS) \
+ <<"Descriptor<"<<bbtk::TypeName<T1>()<<"," \
+ <<bbtk::TypeName<T2>()<<">::New"<<std::endl); \
+ Pointer p = MakePointer(new Self()); \
+ bbtkDebugMessage("object",1,"<## "<<BBTK_STRINGIFY(CLASS) \
+ <<"Descriptor<"<<bbtk::TypeName<T1>()<<"," \
+ <<bbtk::TypeName<T2>()<<">::New"<<std::endl); \
+ return p; \
+ } \
+ virtual bbtk::AtomicBlackBoxDescriptor::Pointer GetInstance() const \
+ { \
+ return Instance(); \
+ } \
+ static bbtk::AtomicBlackBoxDescriptor::Pointer Instance() \
+ { \
+ static bbtk::AtomicBlackBoxDescriptor::WeakPointer i; \
+ bbtk::AtomicBlackBoxDescriptor::Pointer j; \
+ if (!i.lock()) { j = Self::New(); i = j; } \
+ return i.lock(); \
+ } \
+ bbtk::BlackBox::Pointer NewBlackBox(const std::string& name) \