//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// package mx.utils { import flash.utils.describeType; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; import mx.binding.BindabilityInfo; [ExcludeClass] /** * @private * DescribeTypeCache is a convenience class that is used to * cache the return values of flash.utils.describeType() * so that calls made subsequent times return faster. * * This class also lets you set handler functions for specific value types. * These will get called when the user tries to access these values on * the DescribeTypeCacheRecord class. * * @see mx.utils.DescribeTypeCacheRecord */ public class DescribeTypeCache { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Class initialization // //-------------------------------------------------------------------------- registerCacheHandler("bindabilityInfo", bindabilityInfoHandler); //-------------------------------------------------------------------------- // // Class variables // //-------------------------------------------------------------------------- /** * @private */ private static var typeCache:Object = {}; /** * @private */ private static var cacheHandlers:Object = {}; //-------------------------------------------------------------------------- // // Class methods // //-------------------------------------------------------------------------- /** * Calls flash.utils.describeType() for the first time and caches * the return value so that subsequent calls return faster. * * @param o Can be either a string describing a fully qualified class name or any * ActionScript value, including all available ActionScript types, object instances, * primitive types (such as uint), and class objects. * * @return Returns the cached record. * * @see flash.utils#describeType() * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public static function describeType(o:*):DescribeTypeCacheRecord { var className:String; var cacheKey:String; if (o is String) cacheKey = className = o; else cacheKey = className = getQualifiedClassName(o); //Need separate entries for describeType(Foo) and describeType(myFoo) if (o is Class) cacheKey += "$"; if (cacheKey in typeCache) { return typeCache[cacheKey]; } else { if (o is String) { try { o = getDefinitionByName(o); } catch (error:ReferenceError) { // The o parameter doesn't refer to an ActionScript // definition, it's just a string value. } } var typeDescription:XML = flash.utils.describeType(o); var record:DescribeTypeCacheRecord = new DescribeTypeCacheRecord(); record.typeDescription = typeDescription; record.typeName = className; typeCache[cacheKey] = record; return record; } } /** * registerCacheHandler lets you add function handler for specific strings. * These functions get called when the user refers to these values on a * instance of DescribeTypeCacheRecord. * * @param valueName String that specifies the value for which the handler must be set. * @param handler Function that should be called when user references valueName. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public static function registerCacheHandler(valueName:String, handler:Function):void { cacheHandlers[valueName] = handler; } /** * @private */ internal static function extractValue(valueName:String, record:DescribeTypeCacheRecord):* { if (valueName in cacheHandlers) return cacheHandlers[valueName](record); return undefined; } /** * @private */ private static function bindabilityInfoHandler(record:DescribeTypeCacheRecord):* { return new BindabilityInfo(record.typeDescription); } } }