public ICallableType GetCallableType(CallableSignature signature)
		{
			AnonymousCallableType type = GetCachedCallableType(signature);
			if (type == null)
			{
				type = new AnonymousCallableType(TypeSystemServices, signature);
				_cache.Add(signature, type);
			}
			return type;
		}
		private IType CreateConcreteCallableType(Node sourceNode, AnonymousCallableType anonymousType)
		{
			var module = TypeSystemServices.GetCompilerGeneratedTypesModule();
			
			var name = GenerateCallableTypeNameFrom(sourceNode, module);

			ClassDefinition cd = My<CallableTypeBuilder>.Instance.CreateEmptyCallableDefinition(name);

			cd.Annotate(AnonymousCallableTypeAnnotation);
			cd.Modifiers |= TypeMemberModifiers.Public;
			cd.LexicalInfo = sourceNode.LexicalInfo;

			cd.Members.Add(CreateInvokeMethod(anonymousType));

			Method beginInvoke = CreateBeginInvokeMethod(anonymousType);
			cd.Members.Add(beginInvoke);

			cd.Members.Add(CreateEndInvokeMethod(anonymousType));
			AddGenericTypes(cd);
			module.Members.Add(cd);
			return (IType)cd.Entity;
		}
		public IType GetConcreteCallableType(Node sourceNode, AnonymousCallableType anonymousType)
		{
			return anonymousType.ConcreteType ??
			       (anonymousType.ConcreteType = CreateConcreteCallableType(sourceNode, anonymousType));
		}
		Method CreateInvokeMethod(AnonymousCallableType anonymousType)
		{
			CallableSignature signature = anonymousType.GetSignature();
			return CodeBuilder.CreateRuntimeMethod("Invoke", signature.ReturnType, signature.Parameters, signature.AcceptVarArgs);
		}