@Override
	public GameFont getObject(String name, Map<String, String> data) {
		// Check our cache first if we have already created the object. As
		// always.
		if (cache.containsKey(name)) {
			return cache.get(name);
		}

		// Check if the font is valid, IE contains all of our
		// REQUIRED_XML_FIELDS
		if (!isValidFont(name, data)) {
			return null;
		}

		// Ask the asset manager to slice our asset image for us
		BufferedImage[] charImages = GameAssetManager.getInstance().getObject(BufferedImage[].class, name);
		// The XML stores data on many new lines, so we must use regex to strip
		// white space to get one long string, so that our indexOf(char) is
		// reliable
		String availableChars = data.get("availableChars").replaceAll("\\s+", "");

		// Test expliclitly at this point whether or not the amount of
		// charGraphics equals that of the amount of available chars. Stops any
		// potential out of bound problems etc
		if (charImages.length != availableChars.length()) {
			logger.error(new Exception(), "font ", name, " was invalid! \n",
					"Total chars required : ", availableChars.length(), " :: ", availableChars, "\n",
					"Total graphic chars found : ", charImages.length);
		}

		// Create the new GameFont with all of our loaded information
		GameFont gameFont = new GameFont(name, charImages, availableChars);
		// Apply any additional non-core data that the XML may or may not have
		// to the font
		setAdditionalFields(gameFont, data);

		// Add the new gameFont to the cache system
		cache.put(name, gameFont);

		return gameFont;
	}