 		{
 			adminService = Weave.linkableChild(this, new AMF3Servlet(url + "/AdminService"));
 			dataService = Weave.linkableChild(this, new AMF3Servlet(url + "/DataService"));
+			
 			resetQueue();
-			
-			//var info:* = DescribeType.getInfo(this, DescribeType.METHOD_FLAGS);
-			/* ??? */
-			for each (var item:String in JS.getPropertyNames(this, true))
-			{
-				var func:Function = this[item] as Function;
-				if (func != null)
-					propertyNameLookup.set(func, item);
-			}
-			
 			initializeAdminService();
+		}
+
+		private var map_method_name:Object = new JS.Map(); // method->string
+
+		private function getMethodName(method:Object):String
+		{
+			if (method is String)
+				return method as String;
+			
+			if (!map_method_name.has(method))
+			{
+				for each (var name:String in JS.getPropertyNames(this, true))
+				{
+					if (this[name] === method)
+					{
+						map_method_name.set(method, name);
+						return name;
+					}
+				}
+			}
+			return map_method_name.get(method);
 		}
 		
 		private function resetQueue():void

		 */
		public function addHook(method:Function, captureHandler:Function, resultHandler:Function, faultHandler:Function = null):void
		{
			var methodName:String = propertyNameLookup.get(method);
			if (!methodName)
				throw new Error("method must be a member of WeaveAdminService");
			var hooks:Array = methodHooks[methodName];

		 */		
		private function invokeAdmin(method:Function, parameters:Array, queued:Boolean = true, returnType:Class = null):WeavePromise/*/<any>/*/
		{
			var methodName:String = getMethodName(method);
			if (!methodName)
				throw new Error("method must be a member of WeaveAdminService");
			return generateQuery(adminService, methodName, parameters, queued, returnType);
