/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #ifndef ACORE_FACTORY_HOLDER #define ACORE_FACTORY_HOLDER #include "Define.h" #include "Dynamic/TypeList.h" #include "ObjectRegistry.h" /* * FactoryHolder holds a factory object of a specific type */ template class FactoryHolder { public: typedef ObjectRegistry, Key > FactoryHolderRegistry; FactoryHolder(Key k) : i_key(k) { } virtual ~FactoryHolder() { } inline Key key() const { return i_key; } void RegisterSelf(void) { FactoryHolderRegistry::instance()->InsertItem(this, i_key); } void DeregisterSelf(void) { FactoryHolderRegistry::instance()->RemoveItem(this, false); } /// Abstract Factory create method virtual T* Create(void* data = nullptr) const = 0; private: Key i_key; }; /* * Permissible is a classic way of letting the object decide * whether how good they handle things. This is not retricted * to factory selectors. */ template class Permissible { public: virtual ~Permissible() { } virtual int Permit(const T*) const = 0; }; #endif