]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
ListModeBase: Minor changes to original u_listmode code
[user/henk/code/inspircd.git] / include / modules.h
index e09245de90ebbc29a269888ee769582a6af1c476..3e5ace3f43b64e053a4fcef5482df8494c58961f 100644 (file)
@@ -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<typename T>
 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<T*>(value);
        }
+
+       T* operator*()
+       {
+               return operator->();
+       }
+};
+
+template<typename T>
+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<T*>(value);
+       }
+
+       T* operator*()
+       {
+               return operator->();
+       }
+};
+
+class ModeReference : public dynamic_reference_nocheck<ModeHandler>
+{
+ public:
+       ModeReference(Module* mod, const std::string& modename)
+               : dynamic_reference_nocheck<ModeHandler>(mod, "mode/" + modename) {}
 };
 
 /** Priority types which can be used by Module::Prioritize()