public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (paragraph.getMoreInfoRequired())
                {
                    paragraph.AddInfo("More info is required");
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (paragraph.getSpecIssue())
                {
                    paragraph.AddInfo("This paragraph has an issue");
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (!paragraph.IsApplicable())
                {
                    paragraph.AddInfo("Non applicable paragraph");
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (paragraph.getImplementationStatus() == acceptor.SPEC_IMPLEMENTED_ENUM.Impl_NewRevisionAvailable)
                {
                    paragraph.AddInfo("New revision");
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (!paragraph.getReviewed())
                {
                    paragraph.AddInfo("Not reviewed");
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (paragraph.getImplementationStatus() != acceptor.SPEC_IMPLEMENTED_ENUM.Impl_Implemented)
                {
                    if (Implementations.ImplementedParagraphs.Contains(paragraph))
                    {
                        paragraph.AddInfo("Paragraph is not marked as implemented but has implementations related to it");
                    }
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (paragraph.getImplementationStatus() == acceptor.SPEC_IMPLEMENTED_ENUM.Impl_Implemented)
                {
                    if (!FunctionalTests.TestedParagraphs.Contains(paragraph))
                    {
                        paragraph.AddInfo("Paragraph is implemented but has no associated functional test");
                    }
                }

                base.visit(obj, visitSubNodes);
            }
            public override void visit(Generated.Paragraph obj, bool visitSubNodes)
            {
                Paragraph paragraph = (Paragraph)obj;

                if (!paragraph.getTested())
                {
                    if (FunctionalTests.TestedParagraphs.Contains(paragraph))
                    {
                        paragraph.AddInfo(
                            "Paragraph is not marked as tested, but is already associated functional test(s)");
                    }
                }

                base.visit(obj, visitSubNodes);
            }
        /// <summary>
        /// Performs the delta on the specification provided
        /// </summary>
        /// <param name="delta"></param>
        /// <param name="specifications"></param>
        private void PerformDelta(DataDictionary.Specification.Specification specifications)
        {
            foreach (Paragraph p in NewDocument.ChangedParagraphs)
            {
                DataDictionary.Specification.Paragraph par = specifications.FindParagraph(p.Id);

                if (par != null)
                {
                    par.Text = p.Text;
                    par.AddInfo("Paragraph has been changed");
                    par.setImplementationStatus(DataDictionary.Generated.acceptor.SPEC_IMPLEMENTED_ENUM.Impl_NewRevisionAvailable);
                    par.setReviewed(false);
                    foreach (DataDictionary.ReqRef reqRef in par.Implementations)
                    {
                        DataDictionary.ReqRelated reqRelated = reqRef.Model as DataDictionary.ReqRelated;
                        if (reqRelated != null)
                        {
                            reqRelated.setImplemented(false);
                            reqRelated.setVerified(false);
                        }
                    }
                }
                else
                {
                    AddError(specifications, p, "Cannot find paragraph " + p.Id + " for modification");
                }
            }

            foreach (Paragraph p in NewDocument.NewParagraphs)
            {
                DataDictionary.Specification.Paragraph par = specifications.FindParagraph(p.Id);

                if (par != null)
                {
                    AddError(specifications, p, "Paragraph " + p.Id + " already exists, whereas it has been detected as a new paragraph in the release");
                }
                else
                {
                    par = specifications.FindParagraph(p.Id, true);
                    if (par != null)
                    {
                        par.setText(p.Text);
                        par.AddInfo("New paragraph");
                    }
                    else
                    {
                        AddError(specifications, p, "Paragraph " + p.Id + " cannot be found in the specification");
                    }
                }
            }

            foreach (Paragraph p in NewDocument.RemovedParagraphs)
            {
                DataDictionary.Specification.Paragraph par = specifications.FindParagraph(p.Id);

                if (par != null)
                {
                    par.Text = "<Removed in current release>";
                    par.AddInfo("Paragraph has been removed");
                }
                else
                {
                    AddError(specifications, p, "Cannot find paragraph " + p.Id + " for removal");
                }
            }
        }
            /// <summary>
            ///     Marks the paragraph
            /// </summary>
            /// <param name="paragraph"></param>
            /// <param name="recursively">Indicates that the paragraph should be marked recursively</param>
            /// <returns>true if marking recursively was applied</returns>
            private bool MarkBelongingParagraph(Paragraph paragraph, bool recursively)
            {
                if (!NotImplemented)
                {
                    paragraph.AddInfo("Requirement set " + RequirementSet.Name);
                }
                else if (paragraph.getImplementationStatus() != acceptor.SPEC_IMPLEMENTED_ENUM.Impl_Implemented &&
                         paragraph.getImplementationStatus() != acceptor.SPEC_IMPLEMENTED_ENUM.Impl_NotImplementable)
                {
                    if (paragraph.getType() == acceptor.Paragraph_type.aREQUIREMENT)
                    {
                        paragraph.AddInfo("Belongs to Requirement set " + RequirementSet.Name +
                                          " but is not implemented");
                    }
                }

                if (recursively)
                {
                    foreach (Paragraph subParagraph in paragraph.SubParagraphs)
                    {
                        // ReSharper disable once ConditionIsAlwaysTrueOrFalse
                        MarkBelongingParagraph(subParagraph, recursively);
                    }
                }

                return recursively;
            }