]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/dynref.h
Use IsCTCP in blockcolor for ignoring CTCPs.
[user/henk/code/inspircd.git] / include / dynref.h
index 1d05b35a0c410f58e6a7562c8db9c728544e8209..bcfca9647d6cc0aad4ecd1e1e35875013d72efca 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013 Attila Molnar <attilamolnar@hush.com>
- *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2019-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013-2015 Attila Molnar <attilamolnar@hush.com>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 
 #include "base.h"
 
-class CoreExport dynamic_reference_base : public interfacebase
+class CoreExport dynamic_reference_base : public interfacebase, public insp::intrusive_list_node<dynamic_reference_base>
 {
+ public:
+       class CaptureHook
+       {
+        public:
+               /** Called when the target of the dynamic_reference has been acquired
+                */
+               virtual void OnCapture() = 0;
+       };
+
  private:
        std::string name;
+       CaptureHook* hook;
        void resolve();
  protected:
        ServiceProvider* value;
@@ -33,17 +43,23 @@ class CoreExport dynamic_reference_base : public interfacebase
        ModuleRef creator;
        dynamic_reference_base(Module* Creator, const std::string& Name);
        ~dynamic_reference_base();
-       inline const std::string& GetProvider() { return name; }
+       inline const std::string& GetProvider() const { return name; }
        void SetProvider(const std::string& newname);
+
+       /** Set handler to call when the target object becomes available
+        * @param h Handler to call
+        */
+       void SetCaptureHook(CaptureHook* h) { hook = h; }
+
        void check();
-       operator bool() { return (value != NULL); }
+       operator bool() const { return (value != NULL); }
        static void reset_all();
 };
 
 inline void dynamic_reference_base::check()
 {
        if (!value)
-               throw ModuleException("Dynamic reference to '" + name + "' failed to resolve");
+               throw ModuleException("Dynamic reference to '" + name + "' failed to resolve. Are you missing a module?");
 }
 
 template<typename T>
@@ -63,6 +79,16 @@ class dynamic_reference : public dynamic_reference_base
        {
                return operator->();
        }
+
+       const T* operator->() const
+       {
+               return static_cast<T*>(value);
+       }
+
+       const T* operator*() const
+       {
+               return operator->();
+       }
 };
 
 template<typename T>
@@ -81,6 +107,16 @@ class dynamic_reference_nocheck : public dynamic_reference_base
        {
                return operator->();
        }
+
+       const T* operator->() const
+       {
+               return static_cast<T*>(value);
+       }
+
+       const T* operator*() const
+       {
+               return operator->();
+       }
 };
 
 class ModeHandler;