public IControllerActionReference CreateActionReference(ICodeGeneratorServices services, Type controllerType,
		                                                        string areaName, string controllerName, string actionName,
		                                                        MethodSignature signature,
		                                                        params ActionArgument[] arguments)
		{
			return new ControllerActionReference(services, controllerType, areaName, controllerName, actionName, signature,
			                                     arguments);
		}
		public ControllerActionReference(ICodeGeneratorServices services, Type controllerType, string areaName,
										 string controllerName, string actionName, MethodSignature signature,
										 params ActionArgument[] arguments)
			: base(services, controllerType, areaName, controllerName, actionName)
		{
			Arguments = arguments;
			ActionMethodSignature = signature;
		}
		public MethodInformation ResolveMethodInformation(MethodSignature signature)
		{
			MethodInformation returned;

			@lock.AcquireReaderLock(-1);

			if (methods.ContainsKey(signature.Type))
				if (methods[signature.Type].ContainsKey(signature))
				{
					returned = methods[signature.Type][signature];
					@lock.ReleaseLock();
					return returned;
				}
			
			@lock.UpgradeToWriterLock(-1);

			if (!methods.ContainsKey(signature.Type))
				methods[signature.Type] = new Dictionary<MethodSignature, MethodInformation>();
			
			var method = signature.Type.GetMethod(
				signature.Name, BindingFlags.Public | BindingFlags.Instance, null, signature.Types, new ParameterModifier[0]);
			
			if (method == null)
			{
				@lock.ReleaseLock();
				throw new MissingMethodException(
					String.Format("Missing method: '{0}' on '{1}'", signature.Name, signature.Type.FullName));
			}

			returned = new MethodInformation(method, GetParameters(method), method.GetCustomAttributes(true));
			methods[signature.Type][signature] = returned;

			@lock.ReleaseLock();

			return returned;
		}
		public bool ConvertArgument(MethodSignature signature, ActionArgument argument, IDictionary parameters)
		{
			parameters.Add(argument.Name, argument.Value);
			return true;
		}