//====== Copyright © 1996-2009, Valve Corporation, All rights reserved. =======
// 
// Purpose: Declaration of the CDmeAttributeReference class, a simple DmElement
// used to store references to attributes within other DmElements.
//
//=============================================================================

#ifndef DMEATTRIBUTEREFERENCE_H
#define DMEATTRIBUTEREFERENCE_H
#ifdef _WIN32
#pragma once
#endif

#include "datamodel/dmattributevar.h"

//-------------------------------------------------------------------------------------------------
// The CDmeAttributeReference class provides storage of the information needed to access an 
// attribute in any element. It also provides an interface for accessing the attribute which
// automatically looks up the attribute and caches the handle.
//-------------------------------------------------------------------------------------------------
class CDmeAttributeReference : public CDmElement
{
	DEFINE_ELEMENT( CDmeAttributeReference, CDmElement );

	public:

		// Process notifications of changed attributes and update the attribute handles if needed.
		virtual void OnAttributeChanged( CDmAttribute *pAttribute );
		
		// Set the attribute by specifying the element, name of the attribute and optionally the array index of the attribute.
		bool SetAttribute( CDmElement* pElement, const char* pchAttributeName, int index = 0 );

		// Get the attribute using the cached handle or looking up the handle if needed.
		CDmAttribute* GetReferencedAttribute() const;

		// Get the value of the referenced attribute
		const void *GetAttributeValue( DmAttributeType_t &type ) const;
		
		// Set the value of the referenced attribute
		void SetAttributeValue( const void *pValue, DmAttributeType_t type ) const;

		// Determine if the attribute reference points to a valid attribute
		bool IsValid() const;
		
	private:
	
		// Lookup and cache the attribute handle
		CDmAttribute* LookupAttributeHandle() const;

		CDmaElement< CDmElement >	m_Element;
		CDmaString					m_AttributeName;
		CDmaVar< int >				m_AttributeIndex;

		mutable DmAttributeHandle_t	m_AttributeHandle;
};


#endif // DMEATTRIBUTEREFERENCE_H