         return result;
     }
     
+    public static var callCounter:int;
+    
     public static function typeInfoForProperty(object:*, className:String, propName:String):XObjTypeInfo
     {
         var isArray:Boolean = false;
         var typeInfo:XObjTypeInfo;
+        var shouldCache:Boolean = true;
+        var isDynamic:Boolean;
         
         if (className == "Object" || className == "mx.utils::ObjectProxy")
             return new XObjTypeInfo();

            }
            
            // cache the result for next time
            typePropertyCache[propertyCacheKey] = typeInfo;
        }
        
        

            var typeDesc:* = DescribeTypeCache.describeType(object);
            var typeDescInfo:XML = typeDesc.typeDescription;
            
            if (typeDescInfo.@isDynamic == 'true')
            {
                isDynamic = true;
            }
            
            var accessorList:XMLList = typeDescInfo..accessor.(@name == propName);
            
            if (accessorList.length() > 0)
                typeInfo.typeName = accessorList[0].@type.toString().replace( /::/, "." );
            
            if (!typeInfo.typeName)
            {    
                typeInfo.typeName = typeDescInfo..variable.(@name == propName).@type.toString().replace( /::/, "." );
                
                if (!typeInfo.typeName)
                {
                    // neither accessor nor variable. It's either a function or a dynamic property
                    if (propName in object)
                    {
                        var val:* = object[propName];
                        if (val is Function)
                        {
                            // can't handle these...
                        }
                        else
                        {
                            // must be dynamic property or simply an error (no such property)
                            typeInfo.typeName = XObjUtils.getClassName(val);
                            // don't cache if dynamic
                            if (isDynamic)
                                shouldCache = false;
                        }
                    }
                    else
                    {
                        // bad request. no such property
                    }
                }
                else
                {
                    arrayElementType = typeDescInfo..variable.(@name == propName).metadata.(@name == 'ArrayElementType').arg.@value.toString().replace( /::/, "." );
                    if (!arrayElementType)
                    {
                        // maybe it's a specific desired type using xobj metadata marker
                        arrayElementType = typeDescInfo..variable.(@name == propName).metadata.(@name == 'ElementType').arg.@value.toString().replace( /::/, "." );
                    }
                }
            }
            else
            {
