internal MaterialPropertyGroup(ValveMaterialFile.Reader reader)
        {
            reader.AssertToken("{");

            while (!reader.ReadToken("}"))
            {
                Match match;
                if (reader.ReadRegex(_sNestedRegex, out match))
                {
                    // TODO
                    var nested = new MaterialPropertyGroup(reader);
                    continue;
                }

                reader.AssertRegex(_sPropertyRegex, out match, "shader property");

                var name  = match.Groups["name"];
                var value = match.Groups["value"];

                if (_properties.ContainsKey(name.Value))
                {
                    _properties[name.Value] = value.Value;
                }
                else
                {
                    _properties.Add(name.Value, value.Value);
                }
            }
        }
        public ValveMaterialFile(Stream stream)
        {
            var reader = new Reader(stream);

            Match match;

            while (reader.ReadRegex(_sShaderNameRegex, out match))
            {
                var shader = match.Groups["shader"].Value;
                var group  = new MaterialPropertyGroup(reader);

                _propertyGroups.Add(shader, group);
            }
        }