#ifndef WS_OBJECTPOOL_H_
#define WS_OBJECTPOOL_H_
#include "WSDataObject.h"
#include "templates\WSSmartAssert.h"
#include "WSTaggedListenerManager.h"
#include "WSParamHolder.h"
#include "WSAny.h"
namespace WS {
    typedef ParamHolder ObjectCreationParameters;
    class ObjectPool;
    //class DataObjectManager;
    class DataObject;
    class PoolableObjectManager;
    enum PoolableObjectType {
        POT_NONE,
        POT_SCENEMANAGER,
        POT_SCENENODE,
        POT_LIGHT,
        POT_TERRAINGROUP,
        POT_TERRAINPAGE,
        POT_ADGRAPHICENTITY,  //高级图形实体,相当于Ogre::Entity
        POT_PARTICLESYSTEM,
        POT_SPECIALEFFECT,
        POT_VIEWPORT,
        POT_CAMERA,
        POT_SKELETON,
        POT_UNITENTITY,
        POT_PLAY,
        POT_ITEM,
        POT_CREATURE,
    };
    typedef set<PoolableObjectType>::type PoolableObjectTypeSet;
    class _WSExport PoolableObject
    {
        friend class ObjectPool;
    public:
        enum PoolableObjectState  {PO_IDLE, PO_USE,};
        PoolableObject();
        virtual ~PoolableObject();
        ObjectPool* getObjectPool() {return mObjectPool;}
        void setObjectPool(ObjectPool* val){mObjectPool = val;}
        
        virtual bool getIsAutoRelease() const { return mIsAutoRelease; }
        virtual void setIsAutoRelease(bool isAutoRelease) { mIsAutoRelease = isAutoRelease; }
        virtual Real getAutoReleaseTime() const { return mAutoReleaseTime; };
        virtual void setAutoReleaseTime(Real autoReleaseTime) { mAutoReleaseTime = autoReleaseTime; };
        virtual void update(const Real timeElapsed);
        virtual bool getNeedTouch() const { return mNeedTouch; }
        virtual void setNeedTouch(bool needTouch) { mNeedTouch = needTouch; }
        virtual void unUse(){mState = PO_IDLE;}
        virtual const int getState(){return mState;}
        virtual PoolableObjectType getPoolableObjectType() const { return mPoolableObjectType; }
        virtual void setPoolableObjectType(PoolableObjectType poolableObjectType) { mPoolableObjectType = poolableObjectType; }
        virtual void touch() { mUnTouchTime = 0; }    
        virtual  const String& getPoolableObjectID() const{ return mPoolableObjectID; }
        virtual void setPoolableObjectID (const String &poolableObjectID){ mPoolableObjectID = poolableObjectID; }
        virtual String getClassName(){ return "";};
        //此属性可以给编辑器交互的时候使用
        virtual PropertyValueMap* getPropertyValueParams() const { return mPropertyValueParams; }
        virtual void setPropertyValueParams(PropertyValueMap *propertyValueParams) { mPropertyValueParams = propertyValueParams; }    
        //释放自己
        virtual void releaseSelf();
        void setPoolableObjectManager(PoolableObjectManager *poolableObjectManager) { mPoolableObjectManager = poolableObjectManager; }
        PoolableObjectManager * getPoolableObjectManager() const { return mPoolableObjectManager;}
    protected:
        virtual void _onBorrowed();
        virtual void _onReturned();
    protected:
        ObjectPool* mObjectPool;
        bool mIsAutoRelease;
        Real mAutoReleaseTime;    
        PoolableObjectState mState;
        bool mNeedTouch;
        Real mUnTouchTime;
        String mPoolableObjectID;
        PoolableObjectType mPoolableObjectType;
        PropertyValueMap *mPropertyValueParams;
        bool mIsTriggerCreate;
        PoolableObjectManager *mPoolableObjectManager;
    private:
        //int _addRef();
        //int _release();
        //int mUseCount;
    };
    class _WSExport PoolableObjectFactory
    {
    public:
        friend class ObjectPool;
        //typedef std::vector<PoolableObject*> PoolableObjectVector;
    public:
        virtual ~PoolableObjectFactory();
        virtual PoolableObject* makeObject() = 0;
        virtual void destroyObject(PoolableObject* obj) {delete obj; };
        //bool validateObject(PoolableObject* obj){return false;}
        //void activateObject(PoolableObject* obj){}
        //void passivateObject(PoolableObject* obj){}
    //protected:
    //    //void addObject(PoolableObject* obj);
    //protected:
    //    PoolableObjectVector mPoolableObjects;
    };
    
    typedef map<String, PoolableObjectFactory*>::type PoolableObjectFactoryList;
    class _WSExport PoolableObjectFactoryManager: public Singleton<PoolableObjectFactoryManager>
    {
    public:
        PoolableObjectFactoryManager();
        virtual ~PoolableObjectFactoryManager();
        static PoolableObjectFactoryManager* getSingletonPtr(void);        
        static PoolableObjectFactoryManager& getSingleton(void);
        void addFactory(const String &name, PoolableObjectFactory* factory);
        void removeFactory(const String &name);
        PoolableObjectFactory * getFactory(const String &name);
    protected:
        PoolableObjectFactoryList mFactorys;
        
    };
    class _WSExport ObjectPool
    {
    public:
        typedef deque<PoolableObject*>::type PoolableObjectQueue;
    public:
        ObjectPool(PoolableObjectFactory* factory = NULL);
        virtual ~ObjectPool();
        virtual PoolableObject* borrowObject(PoolableObjectManager *poolableObjectManager = NULL);
        virtual void returnObject(PoolableObject* obj);        
//         int getNumIdle();
//         int getNumActive();
//         void addObject();        
//         void clear();
//         void close();
        void setFactory(PoolableObjectFactory* factory);
        void update(const Real);
        void destoryAllPoolableObjects();
    protected:        
        PoolableObjectFactory* mFactory;
        PoolableObjectQueue mPoolableObjects;        
        //PoolableObjectQueue mIdlePoolableObjects;        
        //PoolableObjectQueue mUsedPoolableObjects;
        //PoolableObjectQueue mReturnPoolableObjects;
    };
    typedef map<String, ObjectPool*>::type ObjectPoolList;    
    class _WSExport ObjectPoolManager: public Singleton<ObjectPoolManager>
    {
    public:
        ObjectPoolManager();
        virtual ~ObjectPoolManager();
        static ObjectPoolManager* getSingletonPtr(void);        
        static ObjectPoolManager& getSingleton(void);
        void addObjectPool(const String &className, ObjectPool* objectPool);
        void removeObjectPool(const String &className);
        ObjectPool * getObjectPool(const String &className);
        void destoryAllPoolableObjects();
    protected:
        ObjectPoolList mObjectPools;
    };
    class _WSExport PoolableObjectManagerListener
    {
    public:
        enum MethodType{
            MT_CREATE,
            MT_INIT,
            MT_DESTROY,
            MT_MODIFY,
        };
        virtual ~PoolableObjectManagerListener() {}
        virtual void onObjectCreated(PoolableObject*, const ObjectCreationParameters& = ObjectCreationParameters()) {}
        virtual void onObjectInitialized(PoolableObject*, const ObjectCreationParameters& = ObjectCreationParameters()) {}
        virtual void onDestroyObject(PoolableObject*) {}
        virtual void onObjectModify(PoolableObject*, const ObjectCreationParameters& = ObjectCreationParameters()) {}        
    };
//PoolableObjectManager可以存放任意类型的对象
    class _WSExport PoolableObjectManager: public ListenerManager<PoolableObjectManagerListener>
    {
    public:
        friend class PoolableObject;
        PoolableObjectManager(const String &className = String(""), DataObjectManager *dataObjectManager = NULL);        
        //PoolableObjectManager(ObjectPool* defaultObjectPool, DataObjectManager *dataObjectManager);
        
        virtual ~PoolableObjectManager();
        virtual void initObjectFromDataObject(PoolableObject* poolableObject, DataObject *dataObject) = 0;
        virtual void initObjectFromDataObject(PoolableObject* poolableObject, const String& dataObjectID);
        virtual PoolableObject* borrowObject();
        virtual PoolableObject* borrowObjectByClassName(const String &className = "");        
        virtual PoolableObject* borrowObjectByID(const String& poolableObjectID, const String &className = "");        
        virtual PoolableObject* borrowObject(const String& dataObjectID,const String& poolableObjectID, const String &className = "");
        virtual PoolableObject* borrowObject(DataObject *dataObject);
        virtual PoolableObject* borrowObject(const String& dataObjectID);
        virtual void returnObject(PoolableObject* obj);
        virtual void returnObject(const String &poolableObjectID);
        virtual void returnAllObjects();
        virtual void delayReturn(PoolableObject* obj);
        virtual void update(const Real);
    public:
        typedef map<String, PoolableObject*>::type PoolableObjectList;
        typedef MapIterator<PoolableObjectList> PoolableObjectIterator;
        PoolableObjectIterator getPoolableObjectIterator(void) {
            return PoolableObjectIterator(mPoolableObjects.begin(), mPoolableObjects.end());
        }
        const PoolableObjectList& getPoolableObjects() const { return mPoolableObjects; }
        virtual PoolableObject* getPoolableObject(const String &poolableObjectID);
        bool hasPoolableObject(const String& poolableObjectID);
    public:
        //void addFactory(const String &name, PoolableObjectFactory* factory);
        //void removeFactory(const String &name);
        void addObjectPool(const String &className, ObjectPool* objectPool = NULL);
        void removeObjectPool(const String &className);
    protected:
        //virtual PoolableObject* makeObject(){ return factory->makeObject();    }
        //virtual PoolableObject* makeObjectFromDataObject(DataObject *dataObject){return factory->makeObjectFromDataObject(dataObject);}
        //virtual PoolableObjectFactory* getFactory() { return mFactory; };
        //virtual ObjectPool* getObjectPool() {return mObjectPool;};
        typedef ListenerManager<PoolableObjectManagerListener> listener_mgr_type;
        void listeners_onObjectCreated(PoolableObject* obj,const ObjectCreationParameters& params = ObjectCreationParameters());
        void listeners_onObjectInitialized(PoolableObject* obj,const ObjectCreationParameters& params = ObjectCreationParameters());
        void listeners_onDestroyObject(PoolableObject* obj);
        String getNextID();
    protected:    
        int32 mIDCounter;
        //PoolableObjectFactory* mDefaultFactory; 
        //PoolableObjectFactoryList mFactorys;
        ObjectPool* mDefaultObjectPool;    //=mObjectPools[0]
        ObjectPoolList mObjectPools;
        DataObjectManager *mDataObjectManager;
        ObjectPoolManager *mObjectPoolManager;
        
    private:
        PoolableObjectList mPoolableObjects;
    
    public:    
        typedef vector<PoolableObjectManagerListener*>::type PoolableObjectManagerListenerList;
        static void addSingletonListener(PoolableObjectManagerListener* listener);
        static void removeSingletonListener(PoolableObjectManagerListener* listener);    
        static PoolableObjectManagerListenerList& getSingletonListeners();
        static bool hasSingletonListeners() { return mSingletonListeners.size() > 0; }
        static void triggerSingletonListeners(PoolableObject* obj, PoolableObjectManagerListener::MethodType methodType, const ObjectCreationParameters& params = ObjectCreationParameters());
    protected:
        //全局监听器,可以用于和编辑器的接口
        static PoolableObjectManagerListenerList mSingletonListeners;
    };
} 
#endif 
#include <WSPrerequisites.h>
#include "WSObjectPool.h"
#include "WSDataObject.h"
#include "WSStringConverter.h"
#include "WSUniqueName.h"
namespace WS
{
    PoolableObjectManager::PoolableObjectManagerListenerList PoolableObjectManager::mSingletonListeners;
    PoolableObject::PoolableObject()
        :mObjectPool(0)
        //,mUseCount(0)
        ,mIsAutoRelease(false)
        ,mAutoReleaseTime(FLT_MAX)
        ,mState(PO_IDLE)
        ,mNeedTouch(false)
        ,mUnTouchTime(0.0f)
        ,mPoolableObjectID(uniqueName::create( "PO" ))
        ,mPoolableObjectType(POT_NONE)
        ,mIsTriggerCreate(false)
        ,mPoolableObjectManager(NULL)
    {
    }
    PoolableObject::~PoolableObject()
    {        
        PoolableObjectManager::triggerSingletonListeners(this, PoolableObjectManagerListener::MT_DESTROY);
    }
    void PoolableObject::releaseSelf()
    {
        if (mPoolableObjectManager)
            mPoolableObjectManager->returnObject(this);
    }
    //int PoolableObject::_addRef()
    //{
    //    ++mUseCount;
    //    return mUseCount;
    //}
    //int PoolableObject::_release()
    //{
    //    if (mUseCount > 0)
    //    {
    //        --mUseCount;
    //    }
    //    
    //    if ((mUseCount == 0) && mObjectPool)
    //    {
    //        _onReturned();            
    //    }
    //    return mUseCount;
    //}
    void PoolableObject::update(const Real timeElapsed)
    {
        if (!mIsTriggerCreate)
        {
            PoolableObjectManager::triggerSingletonListeners(this, PoolableObjectManagerListener::MT_CREATE);
            mIsTriggerCreate = true;
        }
        
        if (mIsAutoRelease)
        {
            mAutoReleaseTime -= timeElapsed;
            if (mAutoReleaseTime <= 0)
            {
                mObjectPool->returnObject(this);
                return;
            }
        }
        if (mNeedTouch)
        {
            mUnTouchTime += timeElapsed;
            if (mUnTouchTime > 300 )
            {
                mObjectPool->returnObject(this);
                return;
            }
        }
        
    }
    void PoolableObject::_onBorrowed()
    {
        mState = PO_USE;
        mAutoReleaseTime = FLT_MAX;
        mIsAutoRelease = false;
        mNeedTouch = false;
        mUnTouchTime = 0.0f;
    }
    void PoolableObject::_onReturned() 
    {
        mState = PO_IDLE;
        PoolableObjectManager::triggerSingletonListeners(this, PoolableObjectManagerListener::MT_DESTROY);
    }
    PoolableObjectFactory::~PoolableObjectFactory()
    {
    }
    PoolableObject* ObjectPool::borrowObject(PoolableObjectManager *poolableObjectManager)
    {
        PoolableObject *pPoolableObject = NULL;
        for (PoolableObjectQueue::iterator iter = mPoolableObjects.begin(); iter != mPoolableObjects.end(); ++iter)
        {
            if ((*iter)->mState == PoolableObject::PO_IDLE)
            {
                pPoolableObject = *iter;
            }
        }
        if(!pPoolableObject)
        {
            pPoolableObject = mFactory->makeObject();
            pPoolableObject->setObjectPool(this);        
            mPoolableObjects.push_back(pPoolableObject);
        }
        pPoolableObject->setPoolableObjectManager(poolableObjectManager);
        pPoolableObject->_onBorrowed();
        return pPoolableObject;
    }
    ObjectPool::ObjectPool(PoolableObjectFactory* factory)
        :mFactory(factory)
    {
        
    }
    ObjectPool::~ObjectPool()
    {
        for (PoolableObjectQueue::iterator iter = mPoolableObjects.begin(); iter != mPoolableObjects.end(); ++iter)
        {
            mFactory->destroyObject(*iter);
        }
        mPoolableObjects.clear();
        //mIdlePoolableObjects.clear();
        //mUsedPoolableObjects.clear();
        //mReturnPoolableObjects.clear();
    }
    void ObjectPool::returnObject(PoolableObject* obj)
    {    
        obj->_onReturned();
        //mReturnPoolableObjects.push_back(obj);
//         PoolableObjectQueue::iterator iter = find(mUsedPoolableObjects.begin(), mUsedPoolableObjects.end(), obj);
//         if (iter != mUsedPoolableObjects.end())
//         {
//             mUsedPoolableObjects.erase(iter);
//         }
//         mIdlePoolableObjects.push_back(obj);
    }
    void ObjectPool::update(const Real timeElapsed)
    {
        //for (PoolableObjectQueue::iterator iter = mReturnPoolableObjects.begin(); iter != mReturnPoolableObjects.end(); ++iter)
        //{
        //    PoolableObjectQueue::iterator iter1 = find(mUsedPoolableObjects.begin(), mUsedPoolableObjects.end(), *iter);
        //    if (iter1 != mUsedPoolableObjects.end())
        //    {
        //        mIdlePoolableObjects.push_back(*iter1);
        //        mUsedPoolableObjects.erase(iter1);
        //        
        //    }
        //}
        //mReturnPoolableObjects.clear();
        for (PoolableObjectQueue::iterator iter = mPoolableObjects.begin(); iter != mPoolableObjects.end(); ++iter)
        {
            if ((*iter)->mState == PoolableObject::PO_USE)
            {
                (*iter)->update(timeElapsed);                
            }
        }
    }
    void ObjectPool::setFactory(PoolableObjectFactory* factory)
    {
        mFactory = factory;
    }
    void ObjectPool::destoryAllPoolableObjects()
    {
        PoolableObjectQueue::reverse_iterator it = mPoolableObjects.rbegin();
        PoolableObjectQueue::reverse_iterator itEnd = mPoolableObjects.rend();
        for (; it != itEnd; ++it)
        {
            mFactory->destroyObject(*it); //returnObject(it->second);
        }
        mPoolableObjects.clear();
    }
    template<> ObjectPoolManager* Singleton<ObjectPoolManager>::ms_Singleton = 0;
    ObjectPoolManager* ObjectPoolManager::getSingletonPtr(void)
    {
        return ms_Singleton; 
    }
    ObjectPoolManager& ObjectPoolManager::getSingleton(void)
    {
        assert( ms_Singleton );  return ( *ms_Singleton );
    }
    ObjectPoolManager::ObjectPoolManager()
    {
    }
    ObjectPoolManager::~ObjectPoolManager()
    {
        //因为有可能对象池是不同的Dll创建的,不能在这里统一释放
        //for (ObjectPoolList::iterator it = mObjectPools.begin(); it != mObjectPools.end(); ++it)
        //{
        //    delete it->second;
        //}
    }
    void ObjectPoolManager::addObjectPool(const String &className, ObjectPool* objectPool)
    {
        mObjectPools[className] = objectPool;
    }
    void ObjectPoolManager::removeObjectPool(const String &className)
    {
        mObjectPools.erase(mObjectPools.find(className));
    }
    ObjectPool* ObjectPoolManager::getObjectPool(const String &className)
    {
        return mObjectPools[className];
    }
    void ObjectPoolManager::destoryAllPoolableObjects()
    {
        ObjectPoolList::reverse_iterator it = mObjectPools.rbegin();
        ObjectPoolList::reverse_iterator itEnd = mObjectPools.rend(); 
        for (; it != itEnd; ++it)
        {
            it->second->destoryAllPoolableObjects();
        }
    }
    PoolableObjectManager::PoolableObjectManager(const String &className, DataObjectManager *dataObjectManager):mIDCounter(0), 
        mDefaultObjectPool(NULL), mDataObjectManager(dataObjectManager), mObjectPoolManager(ObjectPoolManager::getSingletonPtr())
    {
        if (className != "")
        {
            addObjectPool(className, mObjectPoolManager->getObjectPool(className));
        }
    }
    //PoolableObjectManager::PoolableObjectManager(ObjectPool* defaultObjectPool, DataObjectManager *dataObjectManager):
    //    mIDCounter(0), mDefaultObjectPool(defaultObjectPool), mDataObjectManager(dataObjectManager)
    //{         
    //    //if (defaultFactory)
    //    //{
    //    //    mDefaultObjectPool->setFactory(mDefaultFactory);
    //    //    mFactorys["Default"]
    //    //}
    //    
    //}
    PoolableObjectManager::~PoolableObjectManager()
    {
        returnAllObjects();
    }
    PoolableObject* PoolableObjectManager::borrowObjectByID(const String& poolableObjectID, const String &className)
    {
        PoolableObject* obj;
        if (className == "")
        {
            obj = mDefaultObjectPool->borrowObject();
        }
        else
        {    
            ObjectPoolList::iterator it = mObjectPools.find(className);
            if (it == mObjectPools.end())
            {
                ObjectPool *objPool = mObjectPoolManager->getObjectPool(className);
                addObjectPool(className, objPool);
                obj = objPool->borrowObject(this);
            }
            else
            {
                obj = it->second->borrowObject(this);
            }            
        }
        if (poolableObjectID == "" || obj == NULL)
            return NULL;
        mPoolableObjects[poolableObjectID] = obj;
        obj->setPoolableObjectID(poolableObjectID);
        listeners_onObjectCreated(obj, ObjectCreationParameters());
        return obj;
    }
    PoolableObject* PoolableObjectManager::borrowObject(const String& dataObjectID,const String& poolableObjectID, const String &className)
    {
        PoolableObject* obj = borrowObjectByID(poolableObjectID,className);
        initObjectFromDataObject(obj, dataObjectID);
        return obj;
    }
    PoolableObject* PoolableObjectManager::borrowObject()
    {
        return borrowObjectByID(getNextID());
    }
    PoolableObject* PoolableObjectManager::borrowObjectByClassName(const String &className)    
    {
         return borrowObjectByID(getNextID(), className);
    }
    PoolableObject* PoolableObjectManager::borrowObject(DataObject *dataObject)
    {
        PoolableObject* obj = borrowObject();
        initObjectFromDataObject(obj, dataObject);
        return obj;
    }
    PoolableObject* PoolableObjectManager::borrowObject(const String& dataObjectID)
    {
        PoolableObject* obj = borrowObject();
        initObjectFromDataObject(obj, dataObjectID);
        return obj;
    }
    
    void  PoolableObjectManager::returnObject(PoolableObject* obj)
    {    
        if (!obj) return;
        listeners_onDestroyObject(obj);
        PoolableObjectList::iterator it = mPoolableObjects.find(obj->getPoolableObjectID());
        if (it == mPoolableObjects.end()) return;
        mPoolableObjects.erase(it);        
        
        mObjectPools.find(obj->getClassName())->second->returnObject(obj);
        
        //mDefaultObjectPool->returnObject(obj);    
        
    }
    
    void PoolableObjectManager::delayReturn(PoolableObject* obj)
    {
        obj->unUse();
    }
    void PoolableObjectManager::returnObject(const String &poolableObjectID)
    {
        returnObject(mPoolableObjects[poolableObjectID]);        
    }
    void PoolableObjectManager::returnAllObjects()
    {
         PoolableObjectList::iterator it = mPoolableObjects.begin();
        PoolableObjectList::iterator itEnd = mPoolableObjects.end(); 
        for (; it != itEnd; ++it)
        {
            listeners_onDestroyObject(it->second);
            mObjectPools.find(it->second->getClassName())->second->returnObject(it->second);
        }
        mPoolableObjects.clear();
    }
    void PoolableObjectManager::update(const Real timeElapsed)
    {
        PoolableObjectList::iterator it = mPoolableObjects.begin();
        PoolableObjectList::iterator itEnd = mPoolableObjects.end();
        for (; it != itEnd; ++it )
        {
            if ( NULL == it->second)
                continue;
            it->second->update(timeElapsed);            
        }
        for (it = mPoolableObjects.begin(); it != mPoolableObjects.end();)
        {
            if ( NULL == it->second)
                continue;
            PoolableObject* pObject = it->second;
            if (pObject->getState() == PoolableObject::PO_IDLE)
            {
                listeners_onDestroyObject(pObject);                
                it = mPoolableObjects.erase(it);    
                mObjectPools.find(pObject->getClassName())->second->returnObject(pObject);                            
            }    
            else
            {
                it ++;
            }
        }
        //mDefaultObjectPool->update(timeElapsed);
    }
    
    void PoolableObjectManager::initObjectFromDataObject(PoolableObject* poolableObject,const String& dataObjectID)
    {
        DataObjectPtr dataObject = mDataObjectManager->getByID(dataObjectID);
        if (!dataObject.get())
        {
            WS_EXCEPT2(Exception2::ERR_ITEM_NOT_FOUND, 
                mDataObjectManager->getResourceType() + " with ID " + dataObjectID + "' not Found!", 
                "PoolableObjectManager::initObjectFromDataObject");
        }
        initObjectFromDataObject(poolableObject, dataObject.get());
        listeners_onObjectInitialized(poolableObject, ObjectCreationParameters());
    }
    String PoolableObjectManager::getNextID()
    {
        return "AutoID" + StringConverter::toString(mIDCounter++);        
    }
    PoolableObject* PoolableObjectManager::getPoolableObject(const String& poolableObjectID)
    {
        PoolableObjectList::iterator it = mPoolableObjects.find(poolableObjectID);
        if (it != mPoolableObjects.end())
            return it->second;
        else
            return NULL;
    }
    bool PoolableObjectManager::hasPoolableObject(const String& poolableObjectID)
    {
        return mPoolableObjects.find(poolableObjectID) != mPoolableObjects.end();        
    }
    void PoolableObjectManager::listeners_onObjectCreated(PoolableObject* obj, const ObjectCreationParameters& params)
    {
        assert( obj );
        if (!obj)
            return;
        ConstVectorIterator<listener_mgr_type::ListenerList> it(mListeners);
        while (it.hasMoreElements())
            it.getNext()->onObjectCreated(obj,params);
        //PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
        //PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
        //for (; it1 != itEnd1; ++it1)
        //{
        //    (*it1)->onObjectCreated(obj,params);
        //}
    }
    void PoolableObjectManager::listeners_onObjectInitialized(PoolableObject* obj, const ObjectCreationParameters& params)
    {
        assert( obj );
        if (!obj)
            return;
        ConstVectorIterator<listener_mgr_type::ListenerList> it(mListeners);
        while (it.hasMoreElements())
            it.getNext()->onObjectInitialized(obj, params);
        //PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
        //PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
        //for (; it1 != itEnd1; ++it1)
        //{
        //    (*it1)->onObjectInitialized(obj,params);
        //}
    }
    void PoolableObjectManager::listeners_onDestroyObject(PoolableObject* obj)
    {
        assert( obj );
        if (!obj)
            return;
        ConstVectorIterator<listener_mgr_type::ListenerList> it(mListeners);
        while (it.hasMoreElements())
            it.getNext()->onDestroyObject(obj);
        //PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
        //PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
        //for (; it1 != itEnd1; ++it1)
        //{
        //    (*it1)->onDestroyObject(obj);
        //}
    }
    //void PoolableObjectManager::addFactory(const String &name, PoolableObjectFactory* factory)
    //{
    //    mFactorys[name] = factory;
    //}
    //void PoolableObjectManager::removeFactory(const String &name)
    //{
    //    mFactorys.erase(mFactorys.find(name));
    //}
    void PoolableObjectManager::addObjectPool(const String &className, ObjectPool* objectPool)
    {
        if (NULL == objectPool)
            objectPool = ObjectPoolManager::getSingleton().getObjectPool(className);
        if (mObjectPools.size() == 0)
            mDefaultObjectPool = objectPool;
        mObjectPools[className] = objectPool;
    }
    void PoolableObjectManager::removeObjectPool(const String &className)
    {
        mObjectPools.erase(mObjectPools.find(className));
    }
    void PoolableObjectManager::addSingletonListener(PoolableObjectManagerListener* listener)
    {
        mSingletonListeners.push_back(listener);
    }
    void PoolableObjectManager::removeSingletonListener(PoolableObjectManagerListener* listener)
    {
        PoolableObjectManagerListenerList::iterator it = find(mSingletonListeners.begin(), mSingletonListeners.end(), listener);
        mSingletonListeners.erase(it);
    }
    PoolableObjectManager::PoolableObjectManagerListenerList& PoolableObjectManager::getSingletonListeners()
    {
        return mSingletonListeners;
    }
    void PoolableObjectManager::triggerSingletonListeners(PoolableObject* obj, PoolableObjectManagerListener::MethodType methodType, const ObjectCreationParameters& params)
    {
        if (!PoolableObjectManager::hasSingletonListeners()) 
            return;
        PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
        PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
        for (; it1 != itEnd1; ++it1)
        {
            switch (methodType) 
            {
            case PoolableObjectManagerListener::MT_CREATE:
                (*it1)->onObjectCreated(obj, params);
                break;
            case PoolableObjectManagerListener::MT_INIT:
                (*it1)->onObjectInitialized(obj, params);
                break;
            case PoolableObjectManagerListener::MT_DESTROY:
                (*it1)->onDestroyObject(obj);
                break;
            case PoolableObjectManagerListener::MT_MODIFY:
                (*it1)->onObjectModify(obj, params);
                break;
                
            }
            
        }
    }
    template<> PoolableObjectFactoryManager* Singleton<PoolableObjectFactoryManager>::ms_Singleton = 0;
    PoolableObjectFactoryManager* PoolableObjectFactoryManager::getSingletonPtr(void)
    {
        return ms_Singleton; 
    }
    PoolableObjectFactoryManager& PoolableObjectFactoryManager::getSingleton(void)
    {
        assert( ms_Singleton );  return ( *ms_Singleton );
    }
    PoolableObjectFactoryManager::PoolableObjectFactoryManager()
    {
    }
    PoolableObjectFactoryManager::~PoolableObjectFactoryManager()
    {
        //因为有可能工厂是不同的Dll创建的,不能在这里统一释放
        //for (PoolableObjectFactoryList::iterator it = mFactorys.begin(); it != mFactorys.end(); ++it)
        //{
        //    delete it->second;
        //}
    }
    void PoolableObjectFactoryManager::addFactory(const String &name, PoolableObjectFactory* factory)
    {
        mFactorys[name] = factory;
    }
    void PoolableObjectFactoryManager::removeFactory(const String &name)
    {
        mFactorys.erase(mFactorys.find(name));
    }
    PoolableObjectFactory* PoolableObjectFactoryManager::getFactory(const String &name)
    {
        return mFactorys[name];
    }
    
}
实现