/// <summary>
        /// Fires when the host context has changed
        /// </summary>
        /// <param name="Context">The pipeline that is changing state</param>
        /// <param name="OldState">The old state</param>
        /// <param name="NewState">The new state</param>
        void hostContext_StateChanged(Pipeline Context, Pipeline.PipelineStates OldState, Pipeline.PipelineStates NewState)
        {
            switch (NewState)
            {
                case Pipeline.PipelineStates.SourceLoaded:

                    Dictionary<String, StringCollection> parameters = hostContext.Data["CommandParameters"] as Dictionary<String, StringCollection>;
                    StringCollection tCollection = null;
                    if (parameters.TryGetValue("optimize", out tCollection))
                        enabled = Convert.ToBoolean(tCollection[0]);
                    // Collection
                    if (parameters.TryGetValue("collapse", out tCollection))
                        collapse = Convert.ToBoolean(tCollection[0]);
                    // Combination
                    if (parameters.TryGetValue("combine", out tCollection))
                        combine = Convert.ToBoolean(tCollection[0]);
                    if (parameters.TryGetValue("collapse-ignore-fixed", out tCollection))
                        collapseIgnoreFixed = Convert.ToBoolean(tCollection[0]);
                    if (parameters.TryGetValue("collapse-useless-name", out tCollection))
                        foreach(String s in tCollection)
                            uselessWords.Add(s);
                    if (parameters.TryGetValue("collapse-important-name", out tCollection))
                        foreach (String s in tCollection)
                            importantWords.Add(s);
                    if (parameters.TryGetValue("collapse-adv-naming", out tCollection))
                        collapseSpecialNaming = Convert.ToBoolean(tCollection[0]);
                    if (parameters.TryGetValue("combine-replay", out tCollection))
                        logFile = tCollection[0];
                    // Collapse ignore
                    if (!parameters.TryGetValue("collapse-ignore", out collapseIgnore) && collapse)
                        throw new InvalidOperationException("If --collapse is specified, then the --collapse-ignore must be specified");
                    break;
                case Pipeline.PipelineStates.Compiled:
                    if (!enabled) return;
                    // Optimize the COR repository
                    System.Diagnostics.Trace.WriteLine("Optimizing COR Repository...", "information");
                    ClassRepository classRep = hostContext.Data["SourceCR"] as ClassRepository;
                    ClassRepositoryOptimizer optimizer = new ClassRepositoryOptimizer();

                    // Load the replay log if possible
                    var combineLog = new CombineLog();
                    if (!String.IsNullOrEmpty(logFile) && File.Exists(logFile))
                        combineLog = CombineLog.Load(logFile);

                    ClassRepository optimizedRepository = optimizer.Optimize(classRep, combineLog);

                    // Save the replay log
                    if (!String.IsNullOrEmpty(logFile))
                        combineLog.Save(logFile);

                    System.Diagnostics.Trace.WriteLine(string.Format("Optimization resulted in {0:#,##0} fewer features ({1:#0}% reduction)", classRep.Count - optimizedRepository.Count,
                        (1 - ((float)optimizedRepository.Count / classRep.Count)) * 100), "debug");
                    hostContext.Data["SourceCR"] = optimizedRepository;
                    break;
            }

        }
        /// <summary>
        /// Fires when the host context has changed
        /// </summary>
        /// <param name="Context">The pipeline that is changing state</param>
        /// <param name="OldState">The old state</param>
        /// <param name="NewState">The new state</param>
        void hostContext_StateChanged(Pipeline Context, Pipeline.PipelineStates OldState, Pipeline.PipelineStates NewState)
        {
            switch (NewState)
            {
            case Pipeline.PipelineStates.SourceLoaded:

                Dictionary <String, StringCollection> parameters = hostContext.Data["CommandParameters"] as Dictionary <String, StringCollection>;
                StringCollection tCollection = null;
                if (parameters.TryGetValue("optimize", out tCollection))
                {
                    enabled = Convert.ToBoolean(tCollection[0]);
                }
                // Collection
                if (parameters.TryGetValue("collapse", out tCollection))
                {
                    collapse = Convert.ToBoolean(tCollection[0]);
                }
                // Combination
                if (parameters.TryGetValue("combine", out tCollection))
                {
                    combine = Convert.ToBoolean(tCollection[0]);
                }
                if (parameters.TryGetValue("collapse-ignore-fixed", out tCollection))
                {
                    collapseIgnoreFixed = Convert.ToBoolean(tCollection[0]);
                }
                if (parameters.TryGetValue("collapse-useless-name", out tCollection))
                {
                    foreach (String s in tCollection)
                    {
                        uselessWords.Add(s);
                    }
                }
                if (parameters.TryGetValue("collapse-important-name", out tCollection))
                {
                    foreach (String s in tCollection)
                    {
                        importantWords.Add(s);
                    }
                }
                if (parameters.TryGetValue("collapse-adv-naming", out tCollection))
                {
                    collapseSpecialNaming = Convert.ToBoolean(tCollection[0]);
                }
                if (parameters.TryGetValue("combine-replay", out tCollection))
                {
                    logFile = tCollection[0];
                }
                // Collapse ignore
                if (!parameters.TryGetValue("collapse-ignore", out collapseIgnore) && collapse)
                {
                    throw new InvalidOperationException("If --collapse is specified, then the --collapse-ignore must be specified");
                }
                break;

            case Pipeline.PipelineStates.Compiled:
                if (!enabled)
                {
                    return;
                }
                // Optimize the COR repository
                System.Diagnostics.Trace.WriteLine("Optimizing COR Repository...", "information");
                ClassRepository          classRep  = hostContext.Data["SourceCR"] as ClassRepository;
                ClassRepositoryOptimizer optimizer = new ClassRepositoryOptimizer();

                // Load the replay log if possible
                var combineLog = new CombineLog();
                if (!String.IsNullOrEmpty(logFile) && File.Exists(logFile))
                {
                    combineLog = CombineLog.Load(logFile);
                }

                ClassRepository optimizedRepository = optimizer.Optimize(classRep, combineLog);

                // Save the replay log
                if (!String.IsNullOrEmpty(logFile))
                {
                    combineLog.Save(logFile);
                }

                System.Diagnostics.Trace.WriteLine(string.Format("Optimization resulted in {0:#,##0} fewer features ({1:#0}% reduction)", classRep.Count - optimizedRepository.Count,
                                                                 (1 - ((float)optimizedRepository.Count / classRep.Count)) * 100), "debug");
                hostContext.Data["SourceCR"] = optimizedRepository;
                break;
            }
        }