             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 == null || typeInfo.typeName == "")
+            if (!typeInfo.typeName)
             {    
                 typeInfo.typeName = typeDescInfo..variable.(@name == propName).@type.toString().replace( /::/, "." );
-                arrayElementType = typeDescInfo..variable.(@name == propName).metadata.(@name == 'ArrayElementType').arg.@value.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
             {

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

            // Simple String doesn't have any properties
            return new XObjTypeInfo();
        }
        
        if (!propName)
            return new XObjTypeInfo();
        
        var propertyCacheKey:String = className + "." + propName;
        var arrayElementType:String;
