private void BroadcastChange(
            Dictionary <string, IProjectRuleSnapshotModel> projectSnapshot = null,
            Dictionary <string, IProjectRuleSnapshotModel> sourceSnapshot  = null,
            bool disableFastUpToDateCheck = false)
        {
            projectSnapshot = projectSnapshot ?? new Dictionary <string, IProjectRuleSnapshotModel>();

            if (!projectSnapshot.ContainsKey(ConfigurationGeneral.SchemaName))
            {
                projectSnapshot[ConfigurationGeneral.SchemaName] = new IProjectRuleSnapshotModel
                {
                    Properties = ImmutableStringDictionary <string> .EmptyOrdinal
                                 .Add("MSBuildProjectFullPath", _msBuildProjectFullPath)
                                 .Add("MSBuildProjectDirectory", _msBuildProjectDirectory)
                                 .Add("MSBuildAllProjects", _msBuildAllProjects)
                                 .Add("OutputPath", _outputPath)
                                 .Add("DisableFastUpToDateCheck", disableFastUpToDateCheck.ToString())
                };
            }

            var value = IProjectVersionedValueFactory <
                Tuple <
                    IProjectSubscriptionUpdate,
                    IProjectSubscriptionUpdate,
                    IProjectItemSchema> > .Create(
                Tuple.Create(
                    CreateUpdate(projectSnapshot),
                    CreateUpdate(sourceSnapshot),
                    IProjectItemSchemaFactory.Create(_itemTypes)),
                identity : ProjectDataSources.ConfiguredProjectVersion,
                version : _projectVersion);

            _buildUpToDateCheck.OnChanged(value);

            return;

            IProjectSubscriptionUpdate CreateUpdate(Dictionary <string, IProjectRuleSnapshotModel> snapshotBySchemaName)
            {
                var snapshots = ImmutableDictionary <string, IProjectRuleSnapshot> .Empty;
                var changes   = ImmutableDictionary <string, IProjectChangeDescription> .Empty;

                if (snapshotBySchemaName != null)
                {
                    foreach ((string schemaName, IProjectRuleSnapshotModel model) in snapshotBySchemaName)
                    {
                        var change = new IProjectChangeDescriptionModel
                        {
                            After      = model,
                            Difference = new IProjectChangeDiffModel {
                                AnyChanges = true
                            }
                        };

                        snapshots = snapshots.Add(schemaName, model.ToActualModel());
                        changes   = changes.Add(schemaName, change.ToActualModel());
                    }
                }
                return(IProjectSubscriptionUpdateFactory.Implement(snapshots, changes));
            }
        }
            static IProjectSubscriptionUpdate CreateUpdate(Dictionary <string, IProjectRuleSnapshotModel> snapshotBySchemaName)
            {
                var snapshots = ImmutableDictionary <string, IProjectRuleSnapshot> .Empty;
                var changes   = ImmutableDictionary <string, IProjectChangeDescription> .Empty;

                if (snapshotBySchemaName != null)
                {
                    foreach ((string schemaName, IProjectRuleSnapshotModel model) in snapshotBySchemaName)
                    {
                        var change = new IProjectChangeDescriptionModel
                        {
                            After      = model,
                            Difference = new IProjectChangeDiffModel {
                                AnyChanges = true
                            }
                        };

                        snapshots = snapshots.Add(schemaName, model.ToActualModel());
                        changes   = changes.Add(schemaName, change.ToActualModel());
                    }
                }
                return(IProjectSubscriptionUpdateFactory.Implement(snapshots, changes));
            }