#pragma once

namespace node
{
	template< class TypeName >
	inline v8::Local< TypeName > StrongPersistentToLocal( const v8::Persistent< TypeName >& persistent )
	{
		return *reinterpret_cast< v8::Local< TypeName >* >( const_cast< v8::Persistent< TypeName >* >( &persistent ) );
	}

	template< class TypeName >
	inline v8::Local< TypeName > WeakPersistentToLocal( v8::Isolate* isolate, const v8::Persistent< TypeName >& persistent )
	{
		return v8::Local< TypeName >::New( isolate, persistent );
	}


	template< class TypeName >
	inline v8::Local< TypeName > PersistentToLocal( v8::Isolate* isolate, const v8::Persistent< TypeName >& persistent )
	{
		if( persistent.IsWeak( ) )
		{
			return WeakPersistentToLocal( isolate, persistent );
		}
		else
		{
			return StrongPersistentToLocal( persistent );
		}
	}

}
