private static void GenerateSerializeMethod()
        {
            var serializeMethod          = _context.BaseBarfSerializer.ResolveMethod("Serialize", _context.Type, typeof(BarfSerializationArgs));
            var serializeMethodReference = _context.Import(serializeMethod);
            var method = CreateMethodOverride(serializeMethodReference, _context.Import(typeof(void)), false, false, false);

            method.Parameters.Add(new ParameterDefinition(_context.Import(_context.Type))
            {
                Name = "instance"
            });
            method.Parameters.Add(new ParameterDefinition(_context.Import(typeof(BarfSerializationArgs)))
            {
                Name = "args"
            });
            _context.BarfSerializer.Methods.Add(method);
            var methodHeader = new MethodHeader
            {
                Attributes     = CallingConventions.HasThis,
                DeclaringType  = _context.BaseBarfSerializer,
                ParameterTypes = new[] { _context.Type, typeof(BarfSerializationArgs) },
                ReturnType     = typeof(void)
            };

            using (var writer = new CecilCilWriter(methodHeader, method.Body))
            {
                // type is not available yet so we're using void since that type is not referenced anyway.
                _context.SerializerBuilder.GenerateSerializeMethod(writer);
            }
        }
        private static void GenerateFillMethod()
        {
            var fillMethod = typeof(IBarfTester <>)
                             .ResolveGenericType(_context.Type)
                             .ResolveMethod("Fill");
            var fillMethodReference = _context.Module.Import(fillMethod);
            var method = CreateMethodOverride(fillMethodReference, _context.Import(typeof(void)), false, false, true);

            method.Parameters.Add(new ParameterDefinition(_context.Import(_context.Type.ResolveByRef()))
            {
                Name = "instance"
            });
            method.Parameters.Add(new ParameterDefinition(_context.Import(typeof(FillArgs)))
            {
                Name = "args"
            });
            _context.BarfTester.Methods.Add(method);
            var methodHeader = new MethodHeader
            {
                Attributes     = CallingConventions.HasThis,
                DeclaringType  = typeof(void),                // a place holder
                ParameterTypes = new[] { _context.Type.ResolveByRef(), typeof(FillArgs) },
                ReturnType     = typeof(void)
            };

            using (var writer = new CecilCilWriter(methodHeader, method.Body))
            {
                _context.TesterBuilder.GenerateFill(writer);
            }
        }
        private static void GenerateCreateEmptyMethod()
        {
            var createEmptyMethod          = _context.BaseBarfSerializer.ResolveMethod("CreateEmpty", Type.EmptyTypes);
            var createEmtpyMethodReference = _context.Import(createEmptyMethod);
            var method = CreateMethodOverride(createEmtpyMethodReference, _context.Import(_context.Type), false, false, false);

            _context.BarfSerializer.Methods.Add(method);
            var methodHeader = new MethodHeader
            {
                Attributes     = CallingConventions.HasThis,
                DeclaringType  = _context.BaseBarfSerializer,
                ParameterTypes = Type.EmptyTypes,
                ReturnType     = _context.Type
            };

            using (var writer = new CecilCilWriter(methodHeader, method.Body))
            {
                // type is not available yet so we're using void since that type is not referenced anyway.
                _context.SerializerBuilder.GenerateCreateEmptyMethod(writer);
            }
        }