 		 * Recursively builds a mapping of property chains to WeavePath objects from a path specification as used in retrieveRecords
 		 * @param obj A path spec object
 		 * @param prefix A property chain prefix (optional)
-		 * @param output Output object with "chains" and "paths" properties (optional)
-		 * @return An object like {"chains": [], "paths": []}, where "chains" contains property name chains and "paths" contains WeavePath objects
-		 */
-		protected function listChainsAndNodes(obj:Object, prefix:Array = null, output:Object = null):Object
+		 * @param output Output object with "chains" and "columns" properties (optional)
+		 * @return An object like {"chains": [], "columns": []}, where "chains" contains property name chains and "columns" contains IAttributeColumn objects
+		 */
+		protected function listChainsAndColumns(obj:Object, prefix:Array = null, output:Object = null):Object
 		{
 		    if (!prefix)
 		        prefix = [];
 		    if (!output)
-		        output = {chains: [], paths: []};
+		        output = {chains: [], columns: []};
 		    
 		    for (var key:String in obj)
 		    {

		public function retrieveRecords(pathMapping:Object, options:Object):Array
		{
			var dataType:String = options ? options['dataType'] : null;
			var keySet:WeavePath = options ? options['keySet'] : null;
			
			if (!keySet && options is WeavePath)
				keySet = options as WeavePath;
			
			// if only one argument given and it's a WeavePath object, assume it's supposed to be keySetPath.
			if (arguments.length == 1 && pathMapping is WeavePath)
			{
				keySet = pathMapping as WeavePath;
				pathMapping = null;
			}
			

		            if (column is IAttributeColumn)
		            {
		                output.chains.push(prefix.concat(key));
		                output.columns.push(column);
		            }
		        }
		        else
		        {
		            listChainsAndColumns(item, prefix.concat(key), output);
		        }
		    }
		    return output;
