void ComponentFactory::ParseType(Serializer& _ser, tinyxml2::XMLElement* _element)
{
	const natChar *type_str = _element->Attribute("type");
	ref_t type = Hash::Compute(type_str);

	if(type == s_type_ref_t)
	{
		const natChar* value = _element->Attribute("value");
		ref_t ref;
		if(strcmp(value, "") != 0)
		{
			ref = Hash::Compute(value);
		}
		else
		{
			ref = 0;
		}

		_ser << ref;
	}
	else if(type == s_type_tex_t)
	{
		const natChar* value = _element->Attribute("value");
		ref_t ref;
		if(strcmp(value, "") != 0)
		{
			ref = Hash::Compute(value);

			// add it to preload
			TextureManager* texturemanager = GetEntity()->GetKernel()->GetLayer(Layer::s_LayerManager)->GetRootEntity()->GetComponent<TextureManager>();
			texturemanager->Preload(value);
		}
		else
		{
			ref = 0;
		}

		_ser << ref;
	}
	else if(type == s_type_natBool)
	{
		natBool value = _element->BoolAttribute("value");
		_ser << value;
	}
	else if(type == s_type_natChar)
	{
		const natChar* value = _element->Attribute("value");
		natChar value0 = value[0];
		_ser << value0;
	}
	else if(type == s_type_natU8)
	{
		const natU8* value = reinterpret_cast<const natU8*>(_element->Attribute("value"));
		natU8 value0 = value[0];
		_ser << value0;
	}
	else if(type == s_type_natS8)
	{
		const natS8* value = reinterpret_cast<const natS8*>(_element->Attribute("value"));
		natS8 value0 = value[0];
		_ser << value0;
	}
	else if(type == s_type_natU16)
	{
		natU16 value = static_cast<natU16>(_element->IntAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natS16)
	{
		natS16 value = static_cast<natS16>(_element->IntAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natU32)
	{
		natU32 value = static_cast<natU32>(_element->IntAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natS32)
	{
		natS32 value = static_cast<natS32>(_element->IntAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natU64)
	{
		natU64 value = static_cast<natU64>(_element->IntAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natS64)
	{
		natS64 value = static_cast<natS64>(_element->IntAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natF32)
	{
		natF32 value = static_cast<natF32>(_element->FloatAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_natF64)
	{
		natF64 value = static_cast<natF64>(_element->DoubleAttribute("value"));
		_ser << value;
	}
	else if(type == s_type_std_string)
	{
		const natChar* value = _element->Attribute("value");
		std::string str = value;
		_ser << str;
	}
	else if(type == s_type_glm_vec2)
	{
		// ugly stl
		const natChar* value = _element->Attribute("value");
		std::istringstream iss(value);

		std::string value0;
		std::string value1;

		glm::vec2 ret;
		std::getline(iss, value0, ' ');
		if(!std::getline(iss, value1, ' '))
		{
			value1 = "0";
		}

		std::istringstream iss0(value0);
		iss0 >> ret.x;

		std::istringstream iss1(value1);
		iss1 >> ret.y;

		_ser << ret;
	}
	else if(type == s_type_glm_vec3)