/// <summary>
        /// Generates the necessary setter code to set a value of a document.
        /// Handles internal/private setters
        /// </summary>
        /// <param name="frames"></param>
        /// <param name="member"></param>
        /// <param name="variableName"></param>
        /// <param name="documentType"></param>
        /// <param name="generatedType"></param>
        public static void SetMemberValue(this FramesCollection frames, MemberInfo member, string variableName,
                                          Type documentType, GeneratedType generatedType)
        {
            if (member is PropertyInfo property)
            {
                if (property.CanWrite)
                {
                    if (property.SetMethod.IsPublic)
                    {
                        frames.SetPublicMemberValue(member, variableName, documentType);
                    }
                    else
                    {
                        var setterFieldName = generatedType.InitializeLambdaSetterProperty(member, documentType);
                        frames.Code($"{setterFieldName}({{0}}, {variableName});", new Use(documentType));
                    }

                    return;
                }
            }
            else if (member is FieldInfo field)
            {
                if (field.IsPublic)
                {
                    frames.SetPublicMemberValue(member, variableName, documentType);
                }
                else
                {
                    var setterFieldName = generatedType.InitializeLambdaSetterProperty(member, documentType);
                    frames.Code($"{setterFieldName}({{0}}, {variableName});", new Use(documentType));
                }

                return;
            }

            throw new ArgumentOutOfRangeException(nameof(member), $"MemberInfo {member} is not valid in this usage. ");
        }