public DynamicMixinTypeGenerator(ModuleScope scope, Type targetType, IEnumerable <MethodInfo> methodsToOverride, MethodInvocationHandler invocationHandler)
        {
            ArgumentUtility.CheckNotNull("scope", scope);
            ArgumentUtility.CheckNotNull("targetType", targetType);
            ArgumentUtility.CheckNotNull("methodsToOverride", methodsToOverride);
            ArgumentUtility.CheckNotNull("invocationHandler", invocationHandler);

            if (targetType.ContainsGenericParameters)
            {
                throw new NotSupportedException("Open generic target types are not supported by this type generator.");
            }

            _methodsToOverride = methodsToOverride;
            _invocationHandler = invocationHandler;

            string className = "DynamicMixinFor_" + targetType.Name;

            _baseCallInterface = BaseRequirements.BuildBaseRequirements(_methodsToOverride, className + "_BaseRequirements", scope);

            Type mixinBase = typeof(Mixin <,>).MakeGenericType(typeof(object), _baseCallInterface.RequirementsType);

            _emitter = new CustomClassEmitter(scope, className, mixinBase);

            _invocationHandlerField = _emitter.CreateStaticField("InvocationHandler", typeof(MethodInvocationHandler));

            foreach (MethodInfo method in _methodsToOverride)
            {
                AddOverrider(method, _invocationHandlerField);
            }
        }
        public static BaseRequirements BuildBaseRequirements(IEnumerable <MethodInfo> methodsToOverride, string typeName, ModuleScope scope)
        {
            ArgumentUtility.CheckNotNull("methodsToOverride", methodsToOverride);
            ArgumentUtility.CheckNotNullOrEmpty("typeName", typeName);
            ArgumentUtility.CheckNotNull("scope", scope);

            CustomClassEmitter requirementsInterface = new CustomClassEmitter(new InterfaceEmitter(scope, typeName));

            Dictionary <MethodInfo, MethodInfo> methodToInterfaceMap = new Dictionary <MethodInfo, MethodInfo> ();

            foreach (MethodInfo method in methodsToOverride)
            {
                MethodInfo interfaceMethod = DefineEquivalentInterfaceMethod(requirementsInterface, method);
                methodToInterfaceMap.Add(method, interfaceMethod);
            }

            BaseRequirements result = new BaseRequirements(requirementsInterface.BuildType(), methodToInterfaceMap);

            return(result);
        }