/// <summary>
        ///
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public (FilterChain, string[], string[]) RegisterCliOptions(string[] args)
        {
            // Register Filters
            FilterBundle.RegisterCliOptions();
            _filterCount = CliArgs.GetItems().Count();

            // Register Experimental Filters
            ExperimentalBundle.RegisterCliOptions();
            _experimentalFilterCount = CliArgs.GetItems().Count() - _filterCount;

            // Parse CLI args and generate FilterSet of them
            (var filterChain, string[] nonOptionArgs) = CliArgs.ParseFilterArgs(args);

            // Extract non-option and remaining option arguments
            string[] nonFilterOptionArgs;
            (nonOptionArgs, nonFilterOptionArgs) = CliArgs.ExtractOptionArguments(nonOptionArgs);

            return(filterChain, nonOptionArgs, nonFilterOptionArgs);
        }