X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmodules.h;h=3e5ace3f43b64e053a4fcef5482df8494c58961f;hb=9de86c34d41fcbcedf7b332746b7f0e8c37c7c45;hp=e09245de90ebbc29a269888ee769582a6af1c476;hpb=9fc218c005543384bcad73747a0574c8c6ab6289;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/modules.h b/include/modules.h index e09245de9..3e5ace3f4 100644 --- a/include/modules.h +++ b/include/modules.h @@ -286,32 +286,68 @@ class CoreExport dynamic_reference_base : public interfacebase { private: std::string name; + void resolve(); protected: - DataProvider* value; + ServiceProvider* value; public: ModuleRef creator; dynamic_reference_base(Module* Creator, const std::string& Name); ~dynamic_reference_base(); - inline void ClearCache() { value = NULL; } inline const std::string& GetProvider() { return name; } void SetProvider(const std::string& newname); - void lookup(); - operator bool(); + void check(); + operator bool() { return (value != NULL); } static void reset_all(); }; +inline void dynamic_reference_base::check() +{ + if (!value) + throw ModuleException("Dynamic reference to '" + name + "' failed to resolve"); +} + template class dynamic_reference : public dynamic_reference_base { public: dynamic_reference(Module* Creator, const std::string& Name) : dynamic_reference_base(Creator, Name) {} + inline T* operator->() { - if (!value) - lookup(); + check(); return static_cast(value); } + + T* operator*() + { + return operator->(); + } +}; + +template +class dynamic_reference_nocheck : public dynamic_reference_base +{ + public: + dynamic_reference_nocheck(Module* Creator, const std::string& Name) + : dynamic_reference_base(Creator, Name) {} + + T* operator->() + { + return static_cast(value); + } + + T* operator*() + { + return operator->(); + } +}; + +class ModeReference : public dynamic_reference_nocheck +{ + public: + ModeReference(Module* mod, const std::string& modename) + : dynamic_reference_nocheck(mod, "mode/" + modename) {} }; /** Priority types which can be used by Module::Prioritize()