//-----------------------------------------------------------------------
    void ResourceManager::addImpl( ResourcePtr& res )
    {
            OGRE_LOCK_AUTO_MUTEX;

            std::pair<ResourceMap::iterator, bool> result;
        if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup()))
        {
            result = mResources.insert( ResourceMap::value_type( res->getName(), res ) );
        }
        else
        {
            ResourceWithGroupMap::iterator itGroup = mResourcesWithGroup.find(res->getGroup());

            // we will create the group if it doesn't exists in our list
            if( itGroup == mResourcesWithGroup.end())
            {
                ResourceMap dummy;
                mResourcesWithGroup.insert( ResourceWithGroupMap::value_type( res->getGroup(), dummy ) );
                itGroup = mResourcesWithGroup.find(res->getGroup());
            }
            result = itGroup->second.insert( ResourceMap::value_type( res->getName(), res ) );

        }

        // Attempt to resolve the collision
        ResourceLoadingListener* listener = ResourceGroupManager::getSingleton().getLoadingListener();
        if (!result.second && listener)
        {
            if(listener->resourceCollision(res.get(), this) == false)
            {
                // explicitly use previous instance and destroy current
                res.reset();
                return;
            }

            // Try to do the addition again, no seconds attempts to resolve collisions are allowed
            if(ResourceGroupManager::getSingleton().isResourceGroupInGlobalPool(res->getGroup()))
            {
                result = mResources.insert( ResourceMap::value_type( res->getName(), res ) );
            }
            else
            {
                ResourceWithGroupMap::iterator itGroup = mResourcesWithGroup.find(res->getGroup());
                result = itGroup->second.insert( ResourceMap::value_type( res->getName(), res ) );
            }
        }

        if (!result.second)
        {
            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the name " + res->getName() +
                " already exists.", "ResourceManager::add");
        }

        // Insert the handle
        std::pair<ResourceHandleMap::iterator, bool> resultHandle =
            mResourcesByHandle.insert( ResourceHandleMap::value_type( res->getHandle(), res ) );
        if (!resultHandle.second)
        {
            OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "Resource with the handle " +
                StringConverter::toString((long) (res->getHandle())) +
                " already exists.", "ResourceManager::add");
        }
    }