@Override
	protected boolean parse(String line, String typeToRead) {

		String fields[] = line.split("\t");

		// Ommit headers
		if (fields.length <= 6) return false;
		String type = fields[2];

		// Is it the type that we want to read?
		if (!is(type, typeToRead)) return false;

		// Parse fields
		String chromo = fields[0];
		int start = parsePosition(fields[3]);
		int end = parsePosition(fields[4]);
		int strand = (fields[6].equals("-") ? -1 : +1);
		String geneId = "", trId = "";

		// Parse attributes
		if (fields.length >= 8) {
			String attrStr = fields[8];

			if (attrStr.length() > 0) {
				String attrs[] = attrStr.split(";");
				for (int i = 0; i < attrs.length; i++) {
					attrs[i] = attrs[i].trim();
					String kv[] = attrs[i].split("\\s+");
					String key = kv[0];
					String value = unquote(kv[1]);

					if (key.equalsIgnoreCase("gene_id")) geneId = value;
					else if (key.equalsIgnoreCase("transcript_id")) trId = value;
				}
			}
		}

		// Add interval
		String id = typeToRead + "_" + chromo + "_" + (start + 1) + "_" + (end + 1);

		// Sometimes names or IDs may have spaces, we have to get rid of them
		id = id.trim();
		geneId = geneId.trim();

		addInterval(id, type, chromo, start, end, strand, geneId, trId);

		return true;
	}