     {
         WeaveAPI.ClassRegistry.registerImplementation(IDataSource, FREDDataSource, "Federal Reserve Economic Data");
 
-        
-
-        public function FREDDataSource()
-        {
-        }
-
-		
-		
-        override protected function initialize():void
-        {
-            // recalculate all columns previously requested
-            //refreshAllProxyColumns();
-            
-            super.initialize();
-        }
-        
 		private const jsonCache:JsonCache = newLinkableChild(this, JsonCache);
 		
 		public const apiKey:LinkableString = registerLinkableChild(this, new LinkableString("fa99c080bdbd1d486a55e7cb6ab7acbb"));

			jsonCache.getJsonObject(getUrl(method, params), resultHandler, faultHandler);
		}
		
		public function createCategoryNode(data:Object = null):ColumnTreeNode
		{
			if (!data)
			{
				var name:String = WeaveAPI.globalHashMap.getName(this);
				data = {id: 0, name: name};
			}
			return new ColumnTreeNode({
				dataSource: this,
				data: data,
				label: data.name,
				hasChildBranches: true,
				children: function(node:ColumnTreeNode):Array {
					var children:Array = [];
					getJson('category/children', {category_id: node.data.id}, function(result:Object):void {
						var nodes:Array = [];
						for each (var item:Object in result.categories)
							nodes.push(createCategoryNode(item));
						// put categories first in the list
						children.splice.apply(null, [0, 0].concat(nodes));
					});
					getJson('category/series', {category_id: node.data.id}, function(result:Object):void {
						for each (var item:Object in result.seriess)
							children.push(createSeriesNode(item));
					});
					return children;
				}
			});
		}
		
		override protected function refreshHierarchy():void
		{
			for each (var csv:CSVDataSource in csvCache)
				disposeObject(csv);
			csvCache = {};
		}
		
		private var csvCache:Object = {};

			}
			return csv;
		}
		
		override public function getHierarchyRoot():IWeaveTreeNode
		{
			if (!_rootNode)
				_rootNode = createCategoryNode();
			return _rootNode;
		}
		
		public function createCategoryNode(data:Object = null):ColumnTreeNode
		{
			if (!data)
			{
				var name:String = WeaveAPI.globalHashMap.getName(this);
				data = {id: 0, name: name};
			}
			data[META_CATEGORY_ID] = data.id;
			return new ColumnTreeNode({
				dataSource: this,
				data: data,
				idFields: [META_CATEGORY_ID],
				label: data.name,
				hasChildBranches: true,
				children: function(node:ColumnTreeNode):Array {
					var children:Array = [];
					getJson('category/children', {category_id: node.data.id}, function(result:Object):void {
						var nodes:Array = [];
						for each (var item:Object in result.categories)
							nodes.push(createCategoryNode(item));
						// put categories first in the list
						children.splice.apply(null, [0, 0].concat(nodes));
					});
					getJson('category/series', {category_id: node.data.id}, function(result:Object):void {
						for each (var item:Object in result.seriess)
							children.push(createSeriesNode(item));
					});
					return children;
				}
			});
		}
		
		public function createSeriesNode(data:Object):IWeaveTreeNode
		{
			data[META_SERIES_ID] = data.id;
			return new ColumnTreeNode({
				dataSource: this,
				label: data.title,
				data: data,
				idFields: [META_SERIES_ID],
				hasChildBranches: false,
				children: function(node:ColumnTreeNode):Array {
					var csv:CSVDataSource = getObservationsCSV(data.id);
