private void processLine(String line) throws NotesFormatException, MalformedNumberException {
		LOGGER.info(String.format("Reading line: %s", line));

		// tries to match a string pattern
		NotesLine[] linePatterns = NotesLine.values();
		
		for (NotesLine lp : linePatterns) {
			Matcher m = lp.getPattern().matcher(line);
			
			if (m.matches()) {
				LOGGER.info(String.format("\tThe pattern %s matched!", lp));
				
				switch (lp.getType()) {
				case DEFINITION:
					// extract params based on the type of the definition
					switch (lp) {
					case VOGON_ROMAN_MAPPING:
						// create a new vogon number and map it to a roman symbol
						VogonDialect.INSTANCE.addVogonToRomanMapping(m.group(1), RomanSymbol.fromCharacter(m.group(2).charAt(0)));
						
						break;
						
					case VOGON_CURRENCY_QUOTATION:
						// parses to check if all the vogon words have been declared
						String[] vogonNumbers = m.group(1).split("\\s");
						String firstCurrency = m.group(2);
						Integer numberOfSecondCurrency = Integer.parseInt(m.group(3));
						String secondCurrency = m.group(4);
						for (String vn : vogonNumbers) {
							if (!VogonDialect.INSTANCE.containsVogonWord(vn)) {
								throw new NotesFormatException(String.format("A vogon word was used (%s), but was not declared before.", vn));
							}
						}
						VogonNumber materialQuantity = VogonNumber.fromString(m.group(1));
						
												
						// calculates how many Credits (the money currency) is one Silver|Gold|Iron (material currency) worth
						double ratio = numberOfSecondCurrency / (float)materialQuantity.getIntValue();
						
						// adds an entry to the quotations table
						CurrencyConversion.INSTANCE.addQuotation(firstCurrency, secondCurrency, ratio);
						
						break;
					}
					break;
					
				case QUESTION:
					// add to a list of questions that must be answered after the notes file is read
					// the processing of questions (to find answers) is delayed to until the file is fully read
					// so that the program is robust enough to properly consider out of order lines (aka side notes)
					questions.add(new Tuple<>(lp, line));
					LOGGER.info("Added the line as a question.");
					break;
					
				case UNKNOWN:
					// just ignore, as vogon poetry suck =)
					// on a second thought, let's print something in response
					questions.add(new Tuple<>(lp, line));
					LOGGER.info("Added the line as an unkown phrase.");
					break;
				}
				
				break;
			}
		}
	}