 				var colNames:Array = parsedRows[0] || [];
 				// getColumnValues supports columnIndex -1
 				var keyColIndex:int = -1;
-				if (keyColName.value)
+				if (keyColumn.state is String)
 				{
-					keyColIndex = colNames.indexOf(keyColName.value);
+					keyColIndex = colNames.indexOf(keyColumn.state as String);
 					// treat invalid keyColName as an error
 					if (keyColIndex < 0)
 						keyColIndex = -2;
+				}
+				if (keyColumn.state is Number)
+				{
+					keyColIndex = keyColumn.state as Number;
 				}
 				var keyStrings:Array = getColumnValues(parsedRows, keyColIndex, []);
 				var keyTypeString:String = keyType.value;

		}
		
		public const keyType:LinkableString = Weave.linkableChild(this, LinkableString, updateKeys);
		public const keyColName:LinkableString = Weave.linkableChild(this, LinkableString, updateKeys);
		
		public const metadata:LinkableVariable = Weave.linkableChild(this, new LinkableVariable(null, verifyMetadata));
		private function verifyMetadata(value:Object):Boolean

		/**
		 * This will get a list of column names in the data, which are taken directly from the header row and not guaranteed to be unique.
		 */		
		public function getColumnNames():Array/*/<string>/*/
		{
			return getColumnIds().map(asString);
		}
		
		private function asString(value:Object, i:int, a:Array):Boolean
		{
			return value as String;
		}

		/**
		 * A unique list of identifiers for columns which may be a mix of Strings and Numbers, depending on the uniqueness of column names.
		 */
		public function getColumnIds():Array/*/<number|string>/*/
		{
			return columnIds.concat();
		}
