 	import weave.api.data.IAttributeColumn;
 	import weave.api.data.IPrimitiveColumn;
 	import weave.api.data.IQualifiedKey;
+	import weave.api.newLinkableChild;
 	import weave.data.QKeyManager;
 	import weave.utils.AsyncSort;
 	import weave.utils.VectorUtils;

		 */
		override public function getValueFromKey(key:IQualifiedKey, dataType:Class = null):*
		{
			var result:*;
			if (getInternalColumn() != null)
			{
				// validate lookup table if necessary
				if (_keyToIndexMap == null)
					createLookupTable();
				// get the list of internal keys from the given stringValue
				result = Number(_keyToIndexMap[key]);
			}
			else
			{
				result = NaN;
			}
			// cast to other types
			if (dataType == String)
				result = getInternalColumn() ? getInternalColumn().getValueFromKey(key, String) : '';
			else if (dataType == Boolean)
				result = !isNaN(result); // true if key exists in lookup table
			
			return result;
		}
		
		/**

	 */
	public class SortedIndexColumn extends DynamicColumn implements IAttributeColumn, IPrimitiveColumn
	{
		/**
		 * This is used to store the sorted list of keys.
		 */
		private var _keys:Array = [];
		/**
		 * This object maps a key to the index of that key in the sorted list of keys.
		 */
		private var _keyToIndexMap:Dictionary = new Dictionary(true);
		private var _column:IAttributeColumn = null;
		private var _triggerCount:uint = 0;
		private var _asyncSort:AsyncSort = newLinkableChild(this, AsyncSort, handleSorted);
		
		private function validate():void
		{
			_keys = super.keys.concat();
			_column = getInternalColumn();
			_asyncSort.beginSort(_keys, sortByNumericValue);
		}
		private function handleSorted():void
		{
			_triggerCount++; // account for _asyncSort trigger
			_keyToIndexMap = VectorUtils.createLookup(_keys);
		}

		/**
