private void Dump(object obj, TextWriter tw, int currentDepth)
        {
            // SPECIAL CASE - formatter is available
            if (obj != null)
            {
                IDumpFormatter formatter = Settings.GetFormatter(obj.GetType());
                if (formatter != null)
                {
                    tw.Write(formatter.Format(obj));
                    return;
                }
            }

            // SPECIAL CASE - primitive types: nulls, strings, numbers, characters...
            if (obj == null || obj is ValueType || obj is string)
            {
                _formatter.WriteValue(obj, tw);
            }
            //SPECIAL CASE - Lists, arrays...
            else if (obj is IEnumerable)
            {
                IEnumerable collection = obj as IEnumerable;
                foreach (object item in collection)
                {
                    _formatter.NewLine(tw);
                    Dump(item, tw, currentDepth);
                }
            }
            else
            {
                ObjectDump(obj, tw, currentDepth);
            }
        }
        private bool Write(Stack <TraverseNode> nodes, TraverseNode node, TextWriter tw)
        {
            bool result  = false;
            bool isNamed = false;

            if (!string.IsNullOrWhiteSpace(node.Name))
            {
                isNamed = true;
                _formatter.WriteName(node.GetNames(), node.Level, tw, Settings.WriteElementType);
                result = true;
            }

            object obj = node.Item;

            if (obj == null || obj is ValueType || obj is string)
            {
                _formatter.WriteValue(obj, tw, isNamed);
                result = true;
            }
            else if (obj is IEnumerable)
            {
                IList <object> collection = (obj as IEnumerable).Cast <object>().ToList();

                List <TraverseNode> children = new List <TraverseNode>();
                for (int i = 0; i < collection.Count(); i++)
                {
                    object item = collection[i];
                    children.Add(new TraverseNode($"[{i}]", $"{item?.GetType().FullName}[]", item, node, node.Level + 1));
                }

                PrepareChildren(nodes, node, children.Reverse <TraverseNode>());
            }

            return(result);
        }