diff --git a/src/include/interfaceproxy.hpp b/src/include/interfaceproxy.hpp index 46c61af73..14b5e51ad 100644 --- a/src/include/interfaceproxy.hpp +++ b/src/include/interfaceproxy.hpp @@ -90,18 +90,77 @@ namespace lumiera { * */ template - class InterfaceProxy + class FacadeAccessor { + FA* insta_; - friend class lumiera::InstanceHandle;/////////////TODO use an abstraction here! public: + FA& + operator() () + { + if (insta_) + return *insta_; + else + throw error::State("Facade interface currently closed."); + } + }; + + template + class Holder + { + static IMP& open() + { + static char buff[sizeof(IMP)]; + IMP* p = new(buff) IMP(); + insta_ = p; + return *p; + } + template + static void close() + { + IMP* p = static_cast (insta_); + insta_ = 0; + p->~IMP(); + } }; + template + class Proxy; + template + class Mixi; + + template + class Mixi > + : Holder >, + public FA + { + I* _i_; + public: + void setupInterface(I& interface) { _i_ = &interface; } + + }; + + class XYZ; + + template<> + class Proxy + : public Mixi + { + + }; + + template + void + pullUp (InstanceHandle& iha) + { + Proxy >::open().setupInterface(iha.get()); + + } } // namespace lumiera #endif