/// <summary>
        /// Verifies the extension rule.
        /// </summary>
        /// <param name="context">The Interop service context</param>
        /// <param name="info">out parameter to return violation information when rule does not pass</param>
        /// <returns>true if rule passes; false otherwise</returns>
        public override bool?Verify(ServiceContext context, out ExtensionRuleViolationInfo info)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            bool svcDocResult          = false;
            bool metadataResult        = false;
            bool feedAndEntryResult    = false;
            bool referenceResult       = false;
            bool propertyResult        = false;
            bool collectionCountResult = false;
            bool derivedTypeResult     = false;
            bool mediaStreamResult     = false;
            bool crossJoinResult       = false;
            bool allEntitiesResult     = false;
            ExtensionRuleViolationInfo       infoForOne = null;
            List <ExtensionRuleResultDetail> details    = new List <ExtensionRuleResultDetail>();

            svcDocResult = VerificationHelper.VerifySvcDoc(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            metadataResult = VerificationHelper.VerifyMetadata(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            feedAndEntryResult = VerificationHelper.VerifyFeedAndEntry(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            referenceResult = VerificationHelper.VerifyReference(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            propertyResult = VerificationHelper.VerifyPropertyAndValue(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            collectionCountResult = VerificationHelper.VerifyCollectionCount(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            derivedTypeResult = VerificationHelper.VerifyDerivedType(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            mediaStreamResult = VerificationHelper.VerifyMediaStream(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            crossJoinResult = VerificationHelper.VerifyCrossJoin(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            allEntitiesResult = VerificationHelper.VerifyAllEntities(context, out infoForOne);
            if (infoForOne != null)
            {
                details.AddRange(infoForOne.Details);
            }

            info = new ExtensionRuleViolationInfo(context.Destination, context.ResponsePayload, details);
            info.SetDetailsName(this.Name);

            return(svcDocResult && metadataResult && feedAndEntryResult && referenceResult && propertyResult &&
                   collectionCountResult && derivedTypeResult && mediaStreamResult && crossJoinResult && allEntitiesResult);
        }