public static CardInfo Intern(CardInfo cardInfo)
		{
			if (cardInfo == null) throw new ArgumentNullException("cardInfo");
			if (cardPool.ContainsKey(cardInfo.name)) return cardPool[cardInfo.name];
			cardPool[cardInfo.name] = cardInfo;
			return cardInfo;
		}
		static CardInfo()
		{
			cardPool = new Dictionary<string, CardInfo>(StringComparer.InvariantCultureIgnoreCase);
			Assembly currentAssembly = Assembly.GetExecutingAssembly();
			string resourceName = currentAssembly.GetManifestResourceNames().Single(s => s.EndsWith("cards.xml", StringComparison.InvariantCultureIgnoreCase));
			var xml = new XmlDocument();
			xml.Load(currentAssembly.GetManifestResourceStream(resourceName));
			foreach (XmlElement card in xml.DocumentElement.ChildNodes)
			{
				var c = new CardInfo(card.GetAttribute("id"),
				                     card.GetAttribute("name"),
				                     card.GetAttribute("left"),
				                     card.GetAttribute("up"),
				                     card.GetAttribute("right"),
				                     card.GetAttribute("down"),
				                     card.GetAttribute("element"));
				cardPool.Add(c.name, c);
			}
		}
		public bool Equals(CardInfo other)
		{
			if (ReferenceEquals(null, other)) return false;
			if (ReferenceEquals(this, other)) return true;
			return other.name == name;
		}
		public PlayCard(CardInfo cardInfo)
		{
			this.cardInfo = cardInfo;
			inUse = false;
			isBlue = false;
		}
		public PlayCard(CardInfo cardInfo, bool isBlue): this(cardInfo)
		{
			this.isBlue = isBlue;
		}
		public PlayCard Extract(CardInfo cardInfo)
		{
			byte i = 0;
			while (hand[i].cardInfo != cardInfo) i++;
			return Extract(i);
		}