Index: libcfa/src/parseconfig.cfa
===================================================================
--- libcfa/src/parseconfig.cfa	(revision 45b772cf0406fccbf48768567f22b812859bc559)
+++ libcfa/src/parseconfig.cfa	(revision ca83227ffb009f34216fed8e1d1fd267cc1e3ae2)
@@ -77,10 +77,4 @@
 
 
-// TODO: Replace KVPairs with vector2 when it's fully functional
-struct KVPairs {
-	size_t size, max_size;
-	* [ * char, * char ] data;
-};
-
 [ void ] ?{}( & KVPairs kvp ) with ( kvp ) {				// default constructor
 	size = 0; max_size = 0; data = 0p;
@@ -157,10 +151,11 @@
 
 // Parse configuration values from intermediate format
-[ void ] parse_config( [] const char config_file, [] config_entry entries, size_t num_entries, config_format format ) {
-	* KVPairs kv_pairs = 0p;
-	choose ( format ) {
-		case TABULAR_CONFIG:
-			kv_pairs = parse_tabular_config_format( config_file, num_entries );
-	}
+[ void ] parse_config(
+		[] const char config_file,
+		[] config_entry entries,
+		size_t num_entries,
+		KVPairs * (*parser)(const char [], size_t)
+) {
+	* KVPairs kv_pairs = parser( config_file, num_entries );
 
 	int entries_so_far = 0;
Index: libcfa/src/parseconfig.hfa
===================================================================
--- libcfa/src/parseconfig.hfa	(revision 45b772cf0406fccbf48768567f22b812859bc559)
+++ libcfa/src/parseconfig.hfa	(revision ca83227ffb009f34216fed8e1d1fd267cc1e3ae2)
@@ -6,8 +6,4 @@
 // *********************************** initial declarations ***********************************
 
-
-enum config_format {
-	TABULAR_CONFIG
-};
 
 struct config_entry {
@@ -54,4 +50,12 @@
 }
 
+// TODO: Replace KVPairs with vector2 when it's fully functional
+struct KVPairs {
+	size_t size, max_size;
+	* [ * char, * char ] data;
+};
+
+[ void ] add_kv_pair( & KVPairs kv_pairs, [] char key, [] char value );
+
 
 // *********************************** exceptions ***********************************
@@ -82,5 +86,12 @@
 
 
-void parse_config( const char * config_file, config_entry entries[], size_t num_entries, config_format format );
+[ * KVPairs ] parse_tabular_config_format( [] const char config_file, size_t num_entries );
+
+[ void ] parse_config(
+	[] const char config_file,
+	[] config_entry entries,
+	size_t num_entries,
+	KVPairs * (*parser)(const char [], size_t)
+);
 
 bool parse( const char *, const char * & );
Index: tests/parseconfig.cfa
===================================================================
--- tests/parseconfig.cfa	(revision 45b772cf0406fccbf48768567f22b812859bc559)
+++ tests/parseconfig.cfa	(revision ca83227ffb009f34216fed8e1d1fd267cc1e3ae2)
@@ -50,5 +50,5 @@
 	sout | "Different types of destination addresses";
 
-	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 
     sout | "Stop cost: " | config_params.stop_cost;
@@ -68,5 +68,5 @@
 	sout | "Open_Failure thrown when config file does not exist";
 	try {
-		parse_config( xstr(IN_DIR) "doesnt-exist.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+		parse_config( xstr(IN_DIR) "doesnt-exist.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 	} catch( Open_Failure * ex ) {
 		sout | "Failed to open the config file";
@@ -77,5 +77,5 @@
 	sout | "Missing_Config_Entries thrown when config file is missing entries we want";
 	try {
-		parse_config( xstr(IN_DIR) "parseconfig-missing.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+		parse_config( xstr(IN_DIR) "parseconfig-missing.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 	} catch( Missing_Config_Entries * ex ) {
 		msg( ex );
@@ -92,5 +92,5 @@
 
 	try {
-		parse_config( xstr(IN_DIR) "parseconfig-errors.txt", entry, 1, TABULAR_CONFIG );
+		parse_config( xstr(IN_DIR) "parseconfig-errors.txt", entry, 1, parse_tabular_config_format );
 	} catch( Parse_Failure * ex ) {
 		msg( ex );
@@ -106,5 +106,5 @@
 
 	try {
-		parse_config( xstr(IN_DIR) "parseconfig-errors.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+		parse_config( xstr(IN_DIR) "parseconfig-errors.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 	} catch( Validation_Failure * ex ) {
 		msg( ex );
@@ -115,5 +115,5 @@
 	sout | "No error is thrown when validation succeeds";
 	config_params.stop_cost = -1; // Reset value
-	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 	sout | "Stop cost: " | config_params.stop_cost;
 	sout | nl;
@@ -126,5 +126,5 @@
 
 	config_params.stop_cost = -1; // Reset value
-	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 
 	sout | "Stop cost: " | config_params.stop_cost;
@@ -139,5 +139,5 @@
 
 	config_params.stop_cost = -1; // Reset value
-	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, TABULAR_CONFIG );
+	parse_config( xstr(IN_DIR) "parseconfig-all.txt", entries, NUM_ENTRIES, parse_tabular_config_format );
 
 	sout | "Stop cost: " | config_params.stop_cost;
