                         }
                         else
                         {
-                            // must be dynamic property
+                            // 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( /::/, "." );

        return result;
    }
    
    public static function typeInfoForProperty(object:*, className:String, propName:String):XObjTypeInfo
    {
        var isArray:Boolean = false;

            return new XObjTypeInfo();
        }
        
        if (!propName)
            return new XObjTypeInfo();
        
        var propertyCacheKey:String = className + "." + propName;
        var arrayElementType:String;
        
        typeInfo = typePropertyCache[propertyCacheKey];
        
        if (typeInfo == null)
        {
            callCounter++;
            trace("callCounter "+callCounter);
            typeInfo = new XObjTypeInfo();
            
            // go look it up (expensive)
