private void SetCommandParameters(CodeGenerator generator, InputParameterCollection parameters) {
			//Debug.WriteLine("SetCommandParameters(): Command context has " + parameters.Count + " parameters");
			Debug.Indent();
			foreach (InputParameter parameter in parameters) {
				//Debug.WriteLine("Adding Context Parameter '" + parameter.Name + "' Value='" + parameter.Value + "' after index " + generator.Context.Parameters.Count);
				generator.Context.Parameters.Add(parameter.Name, parameter.Value);
			}
			Debug.Unindent();
		}
		private void CheckCodeGenParameters(InputParameterCollection parameters,
		                                    CodeGen.PackageLib.InputParameterCollection packageParameters) {
			if (packageParameters == null) {
				return;
			}
			foreach (CodeGen.PackageLib.InputParameter packageParameter in packageParameters) {
				if (!parameters.Contains(packageParameter.Name)) {
					if (!packageParameter.IsRequired) {
						parameters.Add(packageParameter.Name, packageParameter.Value);
					}
					else {
						throw new ApplicationException(String.Format("Parameter {0} was not specified.", packageParameter.Name));
					}
				}
			}
		}
		private void AddProjectParameters(InputParameterCollection parameters) {
			if (Project != null) {
				foreach (InputParameter parameter in Project.InputParameters) {
					if (!parameters.Contains(parameter.Name)) {
						parameters.Add(parameter.Name, parameter.Value);
					}
				}
			}
		}
		private void CheckTemplateParameters(InputParameterCollection parameters) {
			// TODO: REFACTOR
			// TODO: Add/check parameters from template then package
			SetTemplateBaseFolder();
			try {
				if (_package == "") {
					return;
				}
				else {
					Package package = CodeGen.PackageLib.Package.Load(_package);
					if (package == null || !package.Templates.Contains(_template)) {
						throw new FileNotFoundException("Template '" + _package + "::" + _template + "' not found.");
					}
					else {
						CheckCodeGenParameters(parameters, package.Templates[_template].InputParameters);
						CheckCodeGenParameters(parameters, package.InputParameters);
					}
				}
			}
			finally {
				RestoreTemplateBaseFolder();
			}
		}
		private void PrepareParameters(XmlDocument metadata, MetadataFile inputFile, InputParameterCollection parameters) {
			Debug.WriteLine("PrepareParameters(): Command context has " + parameters.Count + " parameters");
			for (int x = 0; x < 10; x++) {
				bool parameterChanged = false;
				foreach (InputParameter parameter in parameters) {
					if (parameter.Value.IndexOf("$") < 0 && parameter.Value.IndexOf("#") < 0) {
						continue;
					}
					//Debug.WriteLine("PrepareParameters(): Preparing parameter '" + parameter.Name + "' Value='" + parameter.Value + "'");
					Trace.Indent();
					try {
						CodeGenerator generator = CreateGenerator(inputFile);
						SetGeneratorTemplate(generator);
						generator.Template.Name = "Prepare Parameter '" + parameter.Name + "' : value '" + parameter.Value + "'";
						generator.Template.Content = new StringReader(parameter.Value);
						//generator.Template = new Template(parameter.Value, );
						//SetGeneratorTemplate(generator);
						SetCommandParameters(generator, parameters);
						//StringReader reader = ;
						//generator.Template = reader;
						StringWriter writer = new StringWriter();
						generator.UseDefaultEngine = true;
						generator.Generate(metadata, writer);
						//Trace.WriteLineIf(parameter.Value != writer.ToString(), "Prepared parameter '" + parameter.Name + "': OldVal='" + parameter.Value + "' NewVal='" + writer.ToString() + "'");
						if (parameter.Value != writer.ToString()) {
							parameter.Value = writer.ToString();
							parameterChanged = true;
						}
					}
					finally {
						Trace.Unindent();
					}
				}
				if (!parameterChanged) {
					break;
				}
			}
		}