ProgramSP ProgramManager::getVertexGeometryFragmentProgramBy(const string& vertexFilename, const string& geometryFilename, const string& fragmentFilename, const string& type) const
{
	multimap<string, ProgramSP>::const_iterator walker = allPrograms.begin();

	ProgramSP currentProgram;
	while (walker != allPrograms.end())
	{
		currentProgram = walker->second;

		if (currentProgram->getVertexFilename().compare(vertexFilename) == 0 && currentProgram->getGeometryFilename().compare(geometryFilename) == 0 && currentProgram->getFragmentFilename().compare(fragmentFilename) == 0)
		{
			return walker->second;
		}

		walker++;
	}

	currentProgram = ProgramSP(new Program(type, vertexFilename, geometryFilename, fragmentFilename));

	ProgramManager::getInstance()->addProgram(currentProgram);

	return currentProgram;
}
ProgramSP ProgramManager::getProgramBy(const std::string& vertexFilename, const std::string& controlFilename, const std::string& evaluationFilename, const std::string& geometryFilename, const std::string& fragmentFilename) const
{
	multimap<string, ProgramSP>::const_iterator walker = allPrograms.begin();

	ProgramSP currentProgram;
	while (walker != allPrograms.end())
	{
		currentProgram = walker->second;

		if (currentProgram->getVertexFilename().compare(vertexFilename) == 0 && currentProgram->getControlFilename().compare(controlFilename) == 0 && currentProgram->getEvaluationFilename().compare(evaluationFilename) == 0 && currentProgram->getGeometryFilename().compare(geometryFilename) == 0 && currentProgram->getFragmentFilename().compare(fragmentFilename) == 0)
		{
			return walker->second;
		}

		walker++;
	}

	currentProgram
			= ProgramSP(new Program(ProgramManager::DEFAULT_PROGRAM_TYPE, vertexFilename, fragmentFilename));

	ProgramManager::getInstance()->addProgram(currentProgram);

	return currentProgram;
}