/// <summary>
 /// Create a BamlWriter on the passed stream.  The stream must be writable.
 /// </summary>
 public BamlWriter(
     Stream stream)
 {
     if (null == stream)
     {
         throw new ArgumentNullException( "stream" );
     }
     if (!stream.CanWrite)
     {
         throw new ArgumentException(SR.Get(SRID.BamlWriterBadStream));
     }
     
     _parserContext = new ParserContext();
     if (null == _parserContext.XamlTypeMapper) 
     {
         _parserContext.XamlTypeMapper = new BamlWriterXamlTypeMapper(XmlParserDefaults.GetDefaultAssemblyNames(),
                                                                      XmlParserDefaults.GetDefaultNamespaceMaps());
     }
     _xamlTypeMapper = _parserContext.XamlTypeMapper;
     _bamlRecordWriter = new BamlRecordWriter(stream, _parserContext, true);
     _startDocumentWritten = false;
     _depth = 0;
     _closed = false;
     _nodeTypeStack = new ParserStack();
     _assemblies = new Hashtable(7);
    _extensionParser = new MarkupExtensionParser((IParserHelper)this, _parserContext);
    _markupExtensionNodes = new ArrayList();
 }
        /// <summary>
        /// Constructor. Internal so only the XamlParser and select
        /// Avalon object parsers can call it.
        /// </summary>
        internal XamlReaderHelper(
            XamlParser xamlParser,
            ParserContext parserContext,
            XmlReader xmlReader)
        {

            Debug.Assert(xamlParser != null, "Cannot have null xaml parser");
            Debug.Assert(parserContext != null, "Cannot have null parser context");
            Debug.Assert(xmlReader != null, "Cannot have null xmlReader");

            // use the parser class for making resolution callbacks. for GetElementBaseType
            // probably should break that call + the XamlTypeMapper calls into an interface to
            // comletely abstract the resolution from the tokenizer.
            _xamlParser = xamlParser;
            _parserContext = parserContext;

            XmlReader = xmlReader;
            Normalization = true;

            _xamlNodeCollectionProcessor = new XamlNodeCollectionProcessor();

            // setup the _textFlow stack
            _textFlowStack = new Stack();

            // push a rootLevel stack
            // !! Todo. Need a way for caller of the parser to set how
            // the root text should be handled. For now always use InlineBlock.
            TextFlowStackData textFlowStackData = new TextFlowStackData();
            textFlowStackData.StripLeadingSpaces = true;

            TextFlowStack.Push(textFlowStackData);

            _extensionParser = new MarkupExtensionParser((IParserHelper)this, parserContext);

#if UseValidatingReader
            // turn on to setup validating Reader.
            XmlValidatingReader xmlValidatingReader = new XmlValidatingReader(xmlReader);
            xmlValidatingReader.ValidationType = ValidationType.None;
            XmlReader = xmlValidatingReader;

#endif // UseValidatingReader

        }