 
 		/**
 		 * Requests that an object be created if it doesn't already exist at the given path.
-		 * This function can also be used to assert that the object at the current path is of the type you expect it to be.
 		 * @param path The path
 		 * @param type The type
-		 * @return Either an instance of the requested type, a LinkablePlaceholder, or null if the object could not be created.
-		 */
-		public function requestObject(path:Array/*/<string|number>/*/, type:Class):ILinkableObject
+		 * @return Either an instance of the requested type, or null if the object could not be created or a LinkablePlaceholder was created.
+		 */
+		public function requestObject/*/<T>/*/(path:Array/*/<string|number>/*/, type:/*/(new(..._:any[])=>T) | string/*/Class):/*/T/*/ILinkableObject
 		{
 			// Get parent object first in case there is some backwards compatibility code that gets
 			// executed when it is accessed (registering deprecated class definitions, for example).

			// request the child object
			var hashMap:ILinkableHashMap = parent as ILinkableHashMap;
			var dynamicObject:ILinkableDynamicObject = parent as ILinkableDynamicObject;
			var child:Object = null;
			if (hashMap)
			{
				if (childName is Number)

		 * Shortcut for WeaveAPI.SessionManager.getLinkableDescendants()
		 * @copy weave.api.core.ISessionManager#getLinkableDescendants()
		 */
		public static function getDescendants/*/<T>/*/(object:ILinkableObject, filter:/*/(new(..._:any[])=>T) | string/*/Class = null):Array/*/<T & ILinkableObject>/*/
		{
			if (filter is String)
				filter = Weave.getDefinition(String(filter), true);
