 		public function get bitmapData():BitmapData { return bitmap.bitmapData; }
 		public const textGraphics:TextGraphics = new TextGraphics();
 		public const canvas:Canvas = new Canvas();
-		public var keys:Array;
 		public var locals:Object; // for use inside scripts
+		private const filteredKeySet:FilteredKeySet = newLinkableChild(this, FilteredKeySet);
+		
+		public function get keys():Array
+		{
+			return filteredKeySet.keys;
+		}
 		
 		public function getSelectableAttributes():Array
 		{

				if (!locals || scriptChanged)
					locals = {};
				
				// when the vars hash map changes, get the keys from all the columns in it
				if (varsChanged)
					keys = ColumnUtils.getAllKeys(vars.getObjects(IKeySet));
				
				// run the custom script
				drawScript.apply(this);
				

		
		public static const defaultScript:String = <![CDATA[
			import 'flash.utils.Dictionary';
			import 'weave.compiler.GlobalLib';
			import 'weave.data.AttributeColumns.DynamicColumn';
			
			var getStats = WeaveAPI.StatisticsCache.getColumnStatistics;
			var getColumn = locals.getColumn || (locals.getColumn = function(name) { return vars.requestObject(name, DynamicColumn, false); });
