      *
      *  If you omit this property, Flex uses its own default function to determine the
      *  Array of modifiers by looking in the data provider data for the presence of
-     *  the following (boolean) fields: <code>altKey</code>, <code>commandKey</code>,
-     *  <code>controlKey</code>, and <code>shiftKey</code>.
+	 *  the following (boolean) fields: <code>altKey</code>, <code>commandKey</code>,
+	 *  <code>controlKey</code>, and <code>shiftKey</code>.
      *
      *  <p>The <code>keyEquivalentModifiersFunction</code> property is good for handling
      *  formatting, localization, and platform independence.</p>
      *
      *  <p>The key equivalent modifiers function must take a single argument, which
      *  is the item in the data provider, and must return an array of modifier key names.</p>
-     *
+	 *
      *  <pre><code>myKeyEquivalentModifiersFunction(item:Object):Array</code></pre>
      *
      *  @default "undefined"
-     *  
-     *  @langversion 3.0
-     *  @playerversion AIR 1.1
-     *  @productversion Flex 3
      */
     public function get keyEquivalentModifiersFunction():Function
     {

    /**
     *  Returns the mnemonic index for the given data object
     *  based on the <code>mnemonicIndexField</code> and <code>mnemonicIndexFunction</code>
     *  properties. If the method cannot convert the parameter to an integer, it returns -1.
     *
     *  @param data Object to be displayed.
     *
     *  @return The mnemonic index based on the data.
     *  
     *  @langversion 3.0
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    protected function itemToMnemonicIndex(data:Object):int
    {

            return;
        }

		var type:String = dataDescriptor.getType(data).toLowerCase();
		var isSeparator:Boolean = (type == "separator");
		
		// label changes later, but separator is read-only so need to know here
		var nativeMenuItem:NativeMenuItem = new NativeMenuItem("", isSeparator);
		
		if (!isSeparator)
		{
			// enabled
			nativeMenuItem.enabled = dataDescriptor.isEnabled(data);
			
			// checked
			nativeMenuItem.checked = type == "check" && dataDescriptor.isToggled(data);
			
			// data
			nativeMenuItem.data = dataDescriptor.getData(data, mx_internal::_rootModel);
			
			// key equivalent
			nativeMenuItem.keyEquivalent = itemToKeyEquivalent(data);
			
			// key equivalent modifiers
			nativeMenuItem.keyEquivalentModifiers = itemToKeyEquivalentModifiers(data);
			
			// label and mnemonic index
			var labelData:String = itemToLabel(data);
			var mnemonicIndex:int = itemToMnemonicIndex(data);
			
			if (mnemonicIndex >= 0)
			{
				nativeMenuItem.label = parseLabelToString(labelData);
				nativeMenuItem.mnemonicIndex = mnemonicIndex;
			}
			else
			{
				nativeMenuItem.label = parseLabelToString(labelData);
				nativeMenuItem.mnemonicIndex = parseLabelToMnemonicIndex(labelData);
			}
			
			// event listeners
			nativeMenuItem.addEventListener(flash.events.Event.SELECT, itemSelectHandler, false, 0, true);
			
			// recursive
			if (dataDescriptor.isBranch(data, mx_internal::_rootModel) &&
				dataDescriptor.hasChildren(data, mx_internal::_rootModel))
			{
				nativeMenuItem.submenu = createMenu();
				populateMenu(nativeMenuItem.submenu,
					dataDescriptor.getChildren(data, mx_internal::_rootModel));
			}
		}
		
		// done!
		menu.addItem(nativeMenuItem);
    }

    /**
     *  Pops up this menu at the specified location. 
     *
     *  @param stage The Stage object on which to display this menu. 
     *
     *  @param x The number of horizontal pixels, relative to the origin of stage, 
     *  at which to display this menu. 
     * 
     *  @param y The number of vertical pixels, relative to the origin of stage, 
     *  at which to display this menu. 
     */
     public function display(stage:Stage, x:int, y:int):void
     {
     	nativeMenu.display(stage, x, y);     	
     }

    /**
     *  Returns the key equivalent for the given data object
     *  based on the <code>keyEquivalentField</code> and <code>keyEquivalentFunction</code>
	 *  properties. If the method cannot convert the parameter to a String, it returns an
     *  empty string.
     *
     *  @param data Object to be displayed.
     *
     *  @return The key equivalent based on the data.
     */
    protected function itemToKeyEquivalent(data:Object):String
    {
