text: if(!dojo._hasResource["dojox.wire.ml.Invocation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  dojo._hasResource["dojox.wire.ml.Invocation"] = true;
  dojo.provide("dojox.wire.ml.Invocation");
  
  dojo.require("dojox.wire.ml.Action");
  
  dojo.declare("dojox.wire.ml.Invocation", dojox.wire.ml.Action, {
  	//	summary:
  	//		A widget to invoke a method or publish a topic
  	//	description:
  	//		This widget represents a controller task to invoke a method or
  	//		publish a topic when an event (a function) or a topic is issued.
  	//	object:
  	//		A scope of a method to invoke
  	//	method:
  	//		A name of a method to invoke
  	//	topic:
  	//		A name of a topic to publish
  	//	parameters:
  	//		Arguments for the method or the topic
  	//	result:
  	//		A property to store a return value of the method call
  	//	error:
  	//		A property to store an error on the method call
  	object: "",
  	method: "",
  	topic: "",
  	parameters: "",
  	result: "",
  	error: "",
  
  	_run: function(){
  		//	summary:
  		//		Invoke a method or publish a topic
  		//	description:
  		//		If 'topic' is specified, the topic is published with arguments
  		//		specified to 'parameters'.
  		//		If 'method' and 'object' are specified, the method is invoked
  		//		with arguments specified to 'parameters' and set the return
  		//		value to a property specified to 'result'.
  		//		'object', 'parameters' and 'result' can specify properties of
  		//		a widget or an DOM element with the dotted notation.
  		//		If 'parameters' are omitted, the arguments to this method are
  		//		passed as is.
  		if(this.topic){
  			var args = this._getParameters(arguments);
  			try{
  				dojo.publish(this.topic, args);
  				this.onComplete();
  			}catch(e){
  				this.onError(e);
  			}
  		}else if(this.method){
  			var scope = (this.object ? dojox.wire.ml._getValue(this.object) : dojo.global);
  			if(!scope){
  				return; //undefined
  			}
  			var args = this._getParameters(arguments);
  			var func = scope[this.method];
  			if(!func){
  				func = scope.callMethod;
  				if(!func){
  					return; //undefined
  				}
  				args = [this.method, args];
  			}
  			try{
  				var connected = false;
  				if(scope.getFeatures){
  					var features = scope.getFeatures();
  					if((this.method == "fetch" && features["dojo.data.api.Read"]) ||
  						(this.method == "save" && features["dojo.data.api.Write"])){
  						var arg = args[0];
  						if(!arg.onComplete){
  							arg.onComplete = function(){};
  						}
  						//dojo.connect(arg, "onComplete", this, "onComplete");
  						this.connect(arg, "onComplete", "onComplete");
                          if(!arg.onError){
  							arg.onError = function(){};
  						}
  						//dojo.connect(arg, "onError", this, "onError");
  						this.connect(arg, "onError", "onError");
                          connected = true;
  					}
  				}
  				var r = func.apply(scope, args);
  				if(!connected){
  					if(r && (r instanceof dojo.Deferred)){
  						var self = this;
  						r.addCallbacks(
  							function(result){self.onComplete(result);},
  							function(error){self.onError(error);}
  						);
  					}else{
  						this.onComplete(r);
  					}
  				}
  			}catch(e){
  				this.onError(e);
  			}
  		}
  	},
  
  	onComplete: function(/*anything*/result){
  		//	summary:
  		//		A function called when the method or the topic publish
  		//		completed
  		//	description:
  		//		If 'result' attribute is specified, the result object also set
  		//		to the specified property.
  		//	result:
  		//		The return value of a method or undefined for a topic
  		if(this.result){
  			dojox.wire.ml._setValue(this.result, result);
  		}
  		if(this.error){ // clear error
  			dojox.wire.ml._setValue(this.error, "");
  		}
  	},
  
  	onError: function(/*anything*/error){
  		//	summary:
  		//		A function called on an error occurs
  		//	description:
  		//		If 'error' attribute is specified, the error object also set to
  		//		the specified property.
  		//	error:
  		//		The exception or error occurred
  		if(this.error){
  			if(error && error.message){
  				error = error.message;
  			}
  			dojox.wire.ml._setValue(this.error, error);
  		}
  	},
  
  	_getParameters: function(/*Array*/args){
  		//	summary:
  		//		Returns arguments to a method or topic to invoke
  		//	description:
  		//		This method retunrs an array of arguments specified by
  		//		'parameters' attribute, a comma-separated list of IDs and
  		//		their properties in a dotted notation.
  		//		If 'parameters' are omitted, the original arguments are
  		//		used.
  		//	args:
  		//		Arguments to a trigger event or topic
  		if(!this.parameters){
  		 	// use arguments as is
  			return args; //Array
  		}
  		var parameters = [];
  		var list = this.parameters.split(",");
  		if(list.length == 1){
  			var parameter = dojox.wire.ml._getValue(list[0], args);
  			if(dojo.isArray(parameter)){
  				parameters = parameter;
  			}else{
  				parameters.push(parameter);
  			}
  		}else{
  			for(var i in list){
  				parameters.push(dojox.wire.ml._getValue(list[i], args));
  			}
  		}
  		return parameters; //Array
  	}
  });
  
  }
  