internal string GetHelpText(StringCollector collector, string executable)
        {
            var options = Options.Select(o => o.GetUsage(Parser.OptionChar));

            collector.AppendLine("SYNTAX");
            collector.Indent = 2;
            collector.Append(executable);

            foreach (var option in options)
            {
                collector.Append(option);
            }
            collector.AppendLine("");
            collector.Indent = 0;

            collector.AppendLine("");
            collector.AppendLine("OPTIONS");
            collector.Indent = 2;
            foreach (var option in Options)
            {
                collector.AppendLine(option.GetUsage(Parser.OptionChar));
                if (option.Description != "")
                {
                    collector.Indent += 2;
                    collector.AppendLine(option.Description);
                    collector.Indent -= 2;
                }
                if (option.Property.PropertyType.IsEnum)
                {
                    collector.Indent += 4;
                    foreach (var name in Enum.GetNames(option.Property.PropertyType))
                    {
                        var description = option.Property.PropertyType.GetField(name).GetCustomAttribute <DescriptionAttribute>()?.Description;
                        if (description != null)
                        {
                            collector.AppendLine($"{name} - {description}");
                        }
                    }
                    collector.Indent -= 4;
                }
                if (option.DefaultValue != null)
                {
                    collector.Indent += 2;
                    collector.AppendLine($"default: '{option.DefaultValue.Value}'");
                    collector.Indent -= 2;
                }
                collector.AppendLine("");
            }
            collector.Indent = 0;

            return(collector.ToString());
        }
        /// <summary>
        /// Gets the help text.
        /// </summary>
        /// <param name="verb">creates the help text for this option.</param>
        /// <param name="width">Width of the genreated text. (default: 80)</param>
        /// <returns>The help text</returns>
        /// <remarks>
        /// The returned text is not complete. Work in progress.
        /// </remarks>
        public string GetHelpText(string verb = null, int width = 80)
        {
            var collector = new StringCollector(width);
            var assembly  = Assembly.GetEntryAssembly();

            string name;
            string executable;
            string version;

            if (assembly != null)
            {
                version    = assembly.GetName().Version.ToString();
                executable = Path.GetFileName(assembly.Location);

                var titleAttribute = assembly.GetCustomAttribute <AssemblyTitleAttribute>();
                if (titleAttribute != null)
                {
                    name = titleAttribute.Title;
                }
                else
                {
                    name = Path.GetFileNameWithoutExtension(executable);
                }
            }
            else
            {
                name       = "<no assembly title>";
                version    = "<no assembly version>";
                executable = "<no executable>";
            }
            collector.AppendLine($"{name} - {version}");
            collector.AppendLine("");

            var descriptionAttribute = assembly?.GetCustomAttribute <AssemblyDescriptionAttribute>();

            if (descriptionAttribute != null)
            {
                collector.AppendLine("DESCRIPTION");
                collector.Indent = 2;
                collector.AppendLine(descriptionAttribute.Description);
                collector.Indent = 0;
                collector.AppendLine("");
            }

            if (verb != null)
            {
                OptionTypes[verb].GetHelpText(collector, executable);
            }
            else if (OptionTypes.Count == 1)
            {
                OptionType.GetHelpText(collector, executable);
            }
            else
            {
                collector.AppendLine("SYNTAX");
                collector.Indent = 2;
                collector.AppendLine($"{executable} <verb> <options>");
                collector.AppendLine("");
                collector.Indent = 0;

                collector.AppendLine("VERBS");
                collector.Indent = 2;
                foreach (var optionType in OptionTypes.Values)
                {
                    collector.Append(optionType.Verb);
                    if (optionType.Description != "")
                    {
                        collector.AppendLine($"- {optionType.Description}");
                    }
                    else
                    {
                        collector.AppendLine("");
                    }
                }
                collector.Indent = 0;
            }

            return(collector.ToString());
        }