#ifndef _TEMPLATED_CLASS_PARAMETER_H_
#define _TEMPLATED_CLASS_PARAMETER_H_

#include <iostream>
#include "Logger.h"

template<typename T> class Parameter {

	private:

		T value;
		std::string name;
		Logger* pLogger;
		
	public:

		Parameter();
		~Parameter() {};

		void SetLogger(Logger* pLogger);
		void Log(const std::string message);

		virtual std::string ToString() = 0;
		void SetName(std::string name);

		virtual void SetValue(const T& value);
		void GetValue(T& value) const;
};

/*
 * Constructor
 */
template<typename T> Parameter<T>::Parameter():pLogger(NULL) {

}


/*
 * Store logger pointer
 */
template<typename T> void Parameter<T>::SetLogger(Logger* pLogger) {

	this->pLogger = pLogger;
}


/*
 * Call Log method on logger object
 */
template<typename T> void Parameter<T>::Log(const std::string message) {

	if (this->pLogger) {

		this->pLogger->Log(name + ": " + message);
	}
}


/*
 * Set object name (used in subclass)
 */
template<typename T> void Parameter<T>::SetName(std::string name) {

	this->name = name;
}


/*
 * Set new value
 */
template<typename T> void Parameter<T>::SetValue(const T& value) {

	if (this->value!=value) {

		//SET THE VALUE ON THE HARDWARE

		//store new value
		this->value = value;

		Log("Value changed (" +ToString()+ ") ");
	}
	else {

		Log("No need to change");
	}
}


/*
 * Get value
 */
template<typename T> void Parameter<T>::GetValue(T& value) const {

	value = this->value;
}

#endif