--- /dev/null
+// Roast+ License
+
+/*
+*/
+#ifndef __SFJP_ROAST__memory__handle_HPP__
+#define __SFJP_ROAST__memory__handle_HPP__
+
+#include "roast/algorithm/ref_count.hpp"
+
+namespace roast
+{
+ ////////////////////////////////////////////////
+
+ // _ReleaseImpl is requires:
+ //
+ // Methods:
+ // void release(T* ptr);
+
+ ///////////////////////////////////////////////////////////////
+
+ template <typename T, typename _ReleaseImpl>
+ class handle
+ {
+ private:
+ /////////////////////////////////////
+ // Holder
+ struct holder : public ref_count
+ {
+ T m_obj;
+
+ holder(){}
+ holder(const T& obj) : m_obj(obj){}
+ void on_last()
+ {
+ _ReleaseImpl::release(m_obj);
+ delete this;
+ }
+ };
+ /////////////////////////////////////
+
+ holder *m_pholder;
+ public:
+ handle() : m_pholder(new holder()){ m_pholder->up(); }
+ handle(const T& obj) : m_pholder(new holder(obj)){ m_pholder->up(); }
+ handle(const handle& from) : m_pholder(from.m_pholder){ m_pholder->up(); }
+ virtual ~handle(){ m_pholder->down(); }
+
+ /////////////////////////////////////////////////////
+
+ T get(){ return m_pholder->m_obj; }
+ const T get() const { return m_pholder->m_obj; }
+
+ operator T (){ return get(); }
+ operator const T () const { return get(); }
+
+ void set(const T& obj){ m_pholder->m_obj = obj; }
+ T& operator = (const T& obj){ m_pholder->m_obj = obj; return obj; }
+
+ // Copy from Other handle. Current Object was release...
+ handle& operator = (const handle& from)
+ {
+ // Current Object was release...
+ m_pholder->down();
+
+ // New Object copied and Count-Up!
+ m_pholder = from.m_pholder;
+ m_pholder->up();
+
+ return *this;
+ }
+ };
+
+ //////////////////////////////////////////////////////////////
+}
+
+#endif//__SFJP_ROAST__memory__handle_HPP__