// 30May2013-08:11UTC chinajade
        public static string Analyze(
            XElement xElement,
            Func <IEnumerable <WoWObject> > candidateTargets,
            Func <WoWObject, List <string> > targetExclusionChecksProvider)
        {
            Contract.Requires(candidateTargets != null, context => "candidateTargets != null");
            Contract.Requires(targetExclusionChecksProvider != null, context => "funcTargetExclusionCheck != null");

            var excludedUnitReasons = new StringBuilder();

            foreach (var wowObject in candidateTargets())
            {
                List <string> reasons = targetExclusionChecksProvider(wowObject);

                if (reasons.Count > 0)
                {
                    excludedUnitReasons.AppendFormat("    {0} [{1}]{2}",
                                                     wowObject.SafeName,
                                                     string.Join(", ", reasons),
                                                     Environment.NewLine);
                }
            }

            if (excludedUnitReasons.Length > 0)
            {
                excludedUnitReasons.Insert(0, string.Format("{0}Excluded Units:{0}", Environment.NewLine));
                excludedUnitReasons.AppendFormat("{0}    {1}",
                                                 Environment.NewLine,
                                                 QBCLog.GetXmlFileReference(xElement));
            }

            return(excludedUnitReasons.ToString());
        }