private IEnumerable <Guid> InternalGetBaseTemplates(IBaseTemplates item, ISitecoreService service, HashSet <Guid> visitedSet, int depth, bool ignoreTemplate = false)
        {
            if (item == null || depth <= 0)
            {
                return(DefaultBaseTemplateArray);
            }

            // Check direct 'template' field, then base-templates, before finally recursing
            var baseTemplates = new[] { item.Template }
            .Concat((item.TemplateBaseTemplates ?? item.BaseTemplates) ?? Enumerable.Empty <Guid>())
            .Where(id => !visitedSet.Contains(id))
            .ToArray();

            foreach (var id in baseTemplates)
            {
                // prevent traversal of cycles
                visitedSet.Add(id);
            }

            // Breadth first search (recursive)
            return(baseTemplates.Concat(baseTemplates.SelectMany(guid => InternalGetBaseTemplates(service.GetItem <IBaseTemplates>(guid), service, visitedSet, depth - 1))));
        }
 internal IEnumerable <Guid> GetBaseTemplates(IBaseTemplates item, ISitecoreService service, int depth = DefaultDepth, bool ignoreTemplate = false)
 {
     return(InternalGetBaseTemplates(item, service, new HashSet <Guid>(), depth, ignoreTemplate).Concat(new[] { new Guid(DefaultFallbackTemplateId) }));
 }