#ifndef CORE_GLOBAL_H
#define CORE_GLOBAL_H

#include <boost/noncopyable.hpp>

namespace rde
{
namespace core
{
//=============================================================================
/**
 * Simple singleton template (non intrusive, every class can be wrapped).
 *
 * Usage:
 *		Global<Game> game(new Game());
 *		...
 *		Global<Game>::Get()->Frame();
 */
template<typename T>
class Global : public boost::noncopyable
{
public:
	/// If we own given ptr we'll delete it in destructor.
	explicit Global(T* obj, bool isOwned = true)
	:	m_isOwned(isOwned)
	{
		m_prevActiveObject = ms_activeObject;
		ms_activeObject = obj;
	}
	~Global()
	{
		if (m_isOwned)
			delete ms_activeObject;
		ms_activeObject = m_prevActiveObject;
	}

	static T* Get() 
	{
		return ms_activeObject;
	}

private:
	T*			m_prevActiveObject;
	bool		m_isOwned;
	static T*	ms_activeObject;
};
template<typename T> T* Global<T>::ms_activeObject(0);

} // namespace core
} // namespace rde

//-----------------------------------------------------------------------------
#endif // #ifndef CORE_GLOBAL_H
