import nl.idgis.giclient.template.Parameterable; import nl.idgis.giclient.template.ParameterSource; import nl.idgis.giclient.template.CallbackCounter; import mx.utils.Delegate; /** * @author copierrj */ class nl.idgis.giclient.template.Parameter implements Parameterable { private var name:String; private var appliedTo:Parameterable; private var source:ParameterSource; private var sourceName:String; private var subParameters:Array; private var subParameterValues:Object; private var callbackStack:Array; public function Parameter(name:String, appliedTo:Parameterable, source:ParameterSource, sourceName:String) { this.name = name; this.appliedTo = appliedTo; this.source = source; this.sourceName = sourceName; subParameters = new Array(); subParameterValues = new Object(); callbackStack = new Array(); } public function addSubParameter(parameter:Parameter):Void { subParameters.push(parameter); } private function doGetValue() { source.getValue(this); } public function execute(callback:Function):Void { callbackStack.push(callback); if(subParameters.length > 0) { var callbackCounter:CallbackCounter = new CallbackCounter(subParameters.length, Delegate.create(this, doGetValue)); for(var i:Number = 0;i < subParameters.length; i++) { Parameter(subParameters[i]).execute(callbackCounter.getCallback()); } } else { doGetValue(); } } public function setValue(obj:Object) { var callback:Function = Function(callbackStack.pop()); appliedTo.setParameter(name, obj); if(callback != null) { callback(); } } public function getSourceName():String { return sourceName; } public function getValue(name:String):Object { return subParameterValues[name]; } public function setParameter(name : String, value : Object) : Void { subParameterValues[name] = value; } }