      *  @return An Object containing the following properties:
      *  <ul>
      *    <li><code>name</code>: String containing the name of the class;</li>
-     *    <li><code>properties</code>: Sorted list of the property names of the specified object.</li>
+     *    <li><code>properties</code>: Sorted list of the property names of the specified object,
+     *    or references to the original key if the specified object is a Dictionary</li>
      *  </ul>
     */
     public static function getClassInfo(obj:Object,

                    {
                         var pi:Number = parseInt(p);
                         if (isNaN(pi))
                             propertyNames.push(new QName("", p));
                         else
                            propertyNames.push(pi);
                    }

            }
        }

        //TODO this seems slightly fragile, why not use the 'is' operator?
        var isArray:Boolean = (className == "Array");
        var isDict:Boolean  = (className == "flash.utils::Dictionary");
        
        if (isDict)
        {
            // dictionaries can have multiple keys of the same type,
            // (they can index by reference rather than QName, String, or number),
            // which cannot be looked up by QName, so use references to the actual key
            for (var key:* in obj)
            {
                propertyNames.push(key);
            }
        }
        else if (dynamic)
        {
            for (var p:String in obj)
            {
