// Eigene Handler können erstellt werden indem sie entweder von ISemanticHandler oder von BaseSemanticHandler abgeleitet werden.
class MySemanticHandler
	: public ISemanticHandler
{
public:
	MySemanticHandler(const std::string& inName)
		: Name(inName)
	{}

	virtual ~MySemanticHandler()
	{}

	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter)
	{
		// Hier kann der ShaderParameter verändert werden um direkten Einfluss
		// auf den Shader selber zu bekommen

		// Den ShaderParameter nur ändern wenn er auch vom gewünschtem Typ ist
		if (inParameter->get_Type() == ShaderParameterType::Float4)
		{
			D3DXVECTOR4 RoteFarbe(1.0f, 0.0f, 0.0f, 1.0f);
			inParameter->set_Float4( RoteFarbe )
		}
	}

	virtual void OnShaderSystemRefresh(IShader* inShader)
	{
		// Hier kann das Ereigniss abgefangen werden sollte ein Shader
		// erfrischt werden, welcher diesen SemanticHandler benutzt.
	}

	virtual const std::string& get_Name() const
	{
		return Name;
	}

protected:
	std::string Name;
};

IShaderSystem* myShaderSystem;
...

// Dem ShaderSystem kann nun der neue SemanticHandler hinzugefügt werden
myShaderSystem->AddSemanticHandler(new MySemanticHandler("EigeneVertexFarbe"));

/*
Sollte nun in neu erstellten Shadern der Semantic "EigeneVertexFarbe" vorkommen
so wird der neu erstellte Handler aufgerufen.

Die Vernichtung der MySemanticHandler Instanz übernimmt das ShaderSystem beim eigenen ableben.
*/

// SemanticHandler können auch einem Shader direkt zugewiesen werden, damit
// kann verhindert werden das alle Shader diesen SemanticHandler bearbeiten.
IShader* myShader;
...

// Sollte ein SemanticHandler mit dem gleichen get_Name() Ergebniss wie der neue
// Semantichandler existieren so wird der neue Handler den alten Handler ersetzen,
// vorrausgesetzt der alte Handler war ein Handler vom ShaderSystem.
myShader->AddSemanticHandler(new MySemanticHandler("EigeneVertexFarbe"));

