//-----------------------------------------------------------------------------------------------------------------------------------------------------

        public ImplementationClassWriter <TBase> Constructor <TA1, TA2>(Action <ConstructorWriter, Argument <TA1>, Argument <TA2> > body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.InstanceConstructor(OwnerClass, new[] { typeof(TA1), typeof(TA2) }));
            var writer      = new ConstructorWriter(constructor, w => body(w, w.Arg1 <TA1>(), w.Arg2 <TA2>()));

            return(this);
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private FieldMember[] DefinePrimaryConstructor(Func <MethodMember, AttributeWriter> attributes, params object[] argumentNameTypePairs)
        {
            if ((argumentNameTypePairs.Length % 2) != 0)
            {
                throw new ArgumentException("argumentNameTypePairs must be of even length");
            }

            var argumentNames = new string[argumentNameTypePairs.Length / 2];
            var fieldNames    = new string[argumentNameTypePairs.Length / 2];
            var fieldTypes    = new Type[argumentNameTypePairs.Length / 2];

            for (int i = 0; i < fieldNames.Length; i++)
            {
                var name = (string)argumentNameTypePairs[i * 2];

                argumentNames[i] = name.Substring(0, 1).ToLower() + name.Substring(1);
                fieldNames[i]    = "m_" + name;
                fieldTypes[i]    = (Type)argumentNameTypePairs[i * 2 + 1];
            }

            var constructorMember = new ConstructorMember(OwnerClass, ConstructorMethodFactory.InstanceConstructor(OwnerClass, fieldTypes, argumentNames));

            OwnerClass.AddMember(constructorMember);

            var fieldMembers      = fieldTypes.Select((type, index) => DefineField(fieldNames[index], type, isStatic: false)).ToArray();
            var constructorWriter = new PrimaryConstructorWriter(constructorMember, fieldMembers);

            constructorWriter.AddAttributes(attributes);

            return(fieldMembers);
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public ImplementationClassWriter <TBase> Constructor(Action <ConstructorWriter> body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.InstanceConstructor(OwnerClass, Type.EmptyTypes));
            var writer      = new ConstructorWriter(constructor, body);

            return(this);
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private ConstructorMember DefineConstructor(ConstructorMethodFactory factory)
        {
            var constructorMember = new ConstructorMember(OwnerClass, factory);

            OwnerClass.AddMember(constructorMember);
            return(constructorMember);
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public ImplementationClassWriter <TBase> Constructor <TA1, TA2, TA3, TA4, TA5, TA6, TA7, TA8>(Action <ConstructorWriter, Argument <TA1>, Argument <TA2>, Argument <TA3>, Argument <TA4>, Argument <TA5>, Argument <TA6>, Argument <TA7>, Argument <TA8> > body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.InstanceConstructor(OwnerClass, new[] { typeof(TA1), typeof(TA2), typeof(TA3), typeof(TA4), typeof(TA5), typeof(TA6), typeof(TA7), typeof(TA8) }));
            var writer      = new ConstructorWriter(constructor, w => body(w, w.Arg1 <TA1>(), w.Arg2 <TA2>(), w.Arg3 <TA3>(), w.Arg4 <TA4>(), w.Arg5 <TA5>(), w.Arg6 <TA6>(), w.Arg7 <TA7>(), w.Arg8 <TA8>()));

            return(this);
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public ImplementationClassWriter <TBase> StaticConstructor(Action <ConstructorWriter> body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.StaticConstructor(OwnerClass));
            var writer      = new ConstructorWriter(constructor, body);

            return(this);
        }
        public ImplementationClassWriter <TBase> Constructor <TA1>(Func <MethodMember, AttributeWriter> attributes, Action <ConstructorWriter, Argument <TA1> > body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.InstanceConstructor(OwnerClass, new[] { typeof(TA1) }));
            var writer      = new ConstructorWriter(constructor, w => body(w, w.Arg1 <TA1>()));

            writer.AddAttributes(attributes);
            return(this);
        }
        public ImplementationClassWriter <TBase> Constructor(Func <MethodMember, AttributeWriter> attributes, Action <ConstructorWriter> body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.InstanceConstructor(OwnerClass, Type.EmptyTypes));
            var writer      = new ConstructorWriter(constructor, body);

            writer.AddAttributes(attributes);
            return(this);
        }
        public ImplementationClassWriter <TBase> Constructor <TA1, TA2, TA3, TA4, TA5, TA6>(Func <MethodMember, AttributeWriter> attributes, Action <ConstructorWriter, Argument <TA1>, Argument <TA2>, Argument <TA3>, Argument <TA4>, Argument <TA5>, Argument <TA6> > body)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.InstanceConstructor(OwnerClass, new[] { typeof(TA1), typeof(TA2), typeof(TA3), typeof(TA4), typeof(TA5), typeof(TA6) }));
            var writer      = new ConstructorWriter(constructor, w => body(w, w.Arg1 <TA1>(), w.Arg2 <TA2>(), w.Arg3 <TA3>(), w.Arg4 <TA4>(), w.Arg5 <TA5>(), w.Arg6 <TA6>()));

            writer.AddAttributes(attributes);
            return(this);
        }
        public ImplementationClassWriter <TBase> DefaultConstructor(Func <MethodMember, AttributeWriter> attributes = null)
        {
            var constructor = DefineConstructor(ConstructorMethodFactory.DefaultConstructor(OwnerClass));
            var writer      = new DefaultConstructorWriter(constructor);

            writer.AddAttributes(attributes);
            return(this);
        }