 		 * Contains the csv data that should be used elsewhere in the code
 		 */		
 		private var parsedRows:Array;
-		private var columnIds:Array;
+		private var columnIds:Array = [];
 		
 		private function handleParsedRows(rows:Array):void
 		{

		{
			handleURLChange();
			
			if (_attributeHierarchy.value == null && parsedRows)
			{
				// loop through column names, adding indicators to hierarchy
				var root:XML = <hierarchy title={ WeaveAPI.globalHashMap.getName(this) }/>;
				for each (var id:Object in columnIds)
					root.appendChild(getAttrTagFromColumnId(id));
				_attributeHierarchy.value = root;
			}
			// recalculate all columns previously requested because CSV data may have changed.
			for (var proxyColumn:* in _columnToReferenceMap)
				requestColumnFromSource(_columnToReferenceMap[proxyColumn] as IColumnReference, proxyColumn);

		{
		}

		public const metadata:LinkableVariable = registerLinkableChild(this, new LinkableVariable(null, typeofIsObject));
		public const url:LinkableString = newLinkableChild(this, LinkableString);
		public const csvData:LinkableVariable = registerLinkableChild(this, new LinkableVariable(Array), handleCSVDataChange);
		public const keyType:LinkableString = newLinkableChild(this, LinkableString);
		public const keyColName:LinkableString = newLinkableChild(this, LinkableString);
		
		private function typeofIsObject(value:Object):Boolean { return typeof value == 'object'; }
		
		/**
		 * Session state of servletParams must be an object with two properties: 'method' and 'params'
		 * If this is set, it assumes that url.value points to a Weave AMF3Servlet and the servlet method returns a table of data.
