private void Stream(ArrayList data, object elem)
    {
        var thisElementTypes = Types.Where(x => IsSnoopableType(x, elem)).ToList();

        var streams = new IElementStream[]
        {
            new ElementPropertiesStream(_document, data, elem),
            new ElementMethodsStream(_document, data, elem),
            new SpatialElementStream(data, elem),
            new FamilyTypeParameterValuesStream(data, elem),
            new ExtensibleStorageEntityContentStream(_document, data, elem),
            new PartUtilsStream(data, elem)
        };

        foreach (var type in thisElementTypes)
        {
            data.Add(new ClassSeparatorData(type));

            foreach (var elementStream in streams)
            {
                elementStream.Stream(type);
            }
        }

        StreamElementExtensibleStorages(data, elem as Element);
        StreamSimpleType(data, elem);
    }
        private void Stream(ArrayList data, object elem)
        {
            var thisElementTypes = types.Where(x => elem.GetType().IsSubclassOf(x) || elem.GetType() == x || x.IsAssignableFrom(elem.GetType())).ToList();

            var streams = new IElementStream[]
            {
                new ElementPropertiesStream(m_app, data, elem),
                new ElementMethodsStream(m_app, data, elem),
                new SpatialElementStream(data, elem),
                new FamilyTypeParameterValuesStream(data, elem),
                new ExtensibleStorageEntityContentStream(m_app.ActiveUIDocument.Document, data, elem)
            };

            foreach (Type type in thisElementTypes)
            {
                data.Add(new Snoop.Data.ClassSeparator(type));

                foreach (var elementStream in streams)
                {
                    elementStream.Stream(type);
                }
            }

            StreamElementExtensibleStorages(data, elem as Element);

            StreamSimpleType(data, elem);
        }