+ extensions.clear();
+ return classbase::cull();
+}
+
+Extensible::~Extensible()
+{
+ if (!extensions.empty() && ServerInstance && ServerInstance->Logs)
+ ServerInstance->Logs->Log("CULLLIST", LOG_DEBUG, "Extensible destructor called without cull @%p", (void*)this);
+}
+
+LocalExtItem::LocalExtItem(const std::string& Key, Module* mod) : ExtensionItem(Key, mod)
+{
+}
+
+LocalExtItem::~LocalExtItem()
+{
+}
+
+std::string LocalExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) const
+{
+ return "";
+}
+
+void LocalExtItem::unserialize(SerializeFormat format, Extensible* container, const std::string& value)
+{
+}
+
+LocalStringExt::LocalStringExt(const std::string& Key, Module* Owner)
+ : SimpleExtItem<std::string>(Key, Owner) { }
+
+LocalStringExt::~LocalStringExt()
+{
+}
+
+std::string LocalStringExt::serialize(SerializeFormat format, const Extensible* container, void* item) const
+{
+ if (item && format == FORMAT_USER)
+ return *static_cast<std::string*>(item);
+ return "";
+}
+
+LocalIntExt::LocalIntExt(const std::string& Key, Module* mod) : LocalExtItem(Key, mod)
+{
+}
+
+LocalIntExt::~LocalIntExt()
+{
+}
+
+std::string LocalIntExt::serialize(SerializeFormat format, const Extensible* container, void* item) const
+{
+ if (format != FORMAT_USER)
+ return "";
+ return ConvToStr(reinterpret_cast<intptr_t>(item));
+}
+
+intptr_t LocalIntExt::get(const Extensible* container) const
+{
+ return reinterpret_cast<intptr_t>(get_raw(container));
+}
+
+intptr_t LocalIntExt::set(Extensible* container, intptr_t value)
+{
+ if (value)
+ return reinterpret_cast<intptr_t>(set_raw(container, reinterpret_cast<void*>(value)));
+ else
+ return reinterpret_cast<intptr_t>(unset_raw(container));
+}
+
+void LocalIntExt::free(void*)
+{
+}
+
+StringExtItem::StringExtItem(const std::string& Key, Module* mod) : ExtensionItem(Key, mod)
+{
+}
+
+StringExtItem::~StringExtItem()
+{
+}
+
+std::string* StringExtItem::get(const Extensible* container) const
+{
+ return static_cast<std::string*>(get_raw(container));
+}
+
+std::string StringExtItem::serialize(SerializeFormat format, const Extensible* container, void* item) const
+{
+ return item ? *static_cast<std::string*>(item) : "";
+}
+
+void StringExtItem::unserialize(SerializeFormat format, Extensible* container, const std::string& value)
+{
+ if (value.empty())
+ unset(container);
+ else
+ set(container, value);
+}
+
+void StringExtItem::set(Extensible* container, const std::string& value)
+{
+ void* old = set_raw(container, new std::string(value));
+ delete static_cast<std::string*>(old);
+}
+
+void StringExtItem::unset(Extensible* container)
+{
+ void* old = unset_raw(container);
+ delete static_cast<std::string*>(old);
+}
+
+void StringExtItem::free(void* item)
+{
+ delete static_cast<std::string*>(item);
+}
+
+ModuleException::ModuleException(const std::string &message, Module* who)
+ : CoreException(message, who ? who->ModuleSourceFile : "A Module")
+{