public override void AddContractNameAttribute(ManifestBuilder mfb,
                                                  XmlNode node,
                                                  MetaDataCustomAttribute data,
                                                  string contractName)
    {
        // takes endpoint type as argument
        if (data.FixedArgs == null || data.FixedArgs.Length != 1)
        {
            mfb.Error("ServiceEndpoint attribute must have 1 type argument");
            return;
        }

        // now make it easy to split into name=value pairs by doing some
        // string replacing
        string ctorArgument = "contractName=" + data.FixedArgs[0];

        ctorArgument = ctorArgument.Replace("+", " endpointEnd=");
        ctorArgument = ctorArgument.Replace(", V", " v");
        ctorArgument = ctorArgument.Replace(", C", " c");
        ctorArgument = ctorArgument.Replace(", P", " p");
        ctorArgument = ctorArgument.Replace(",", " assembly=");

        // now we can split on ' ' and '=' to get name/value pairs
        string [] endpointConfig = ctorArgument.Split(' ');

        // grab only the contractName, ignore the rest
#if false
        foreach (string attrib in endpointConfig)
        {
            string [] pair = attrib.Split('=');
            if (pair.Length == 2)
            {
                string name  = pair[0];
                string value = pair[1];
                AddAttribute(node, name, value);
            }
        }
#else
        string [] pair = endpointConfig[0].Split('=');
        Debug.Assert(pair.Length == 2);
        string name = pair[0];
        Debug.Assert(name == "contractName");
        string value = pair[1];
        base.AddContractNameAttribute(mfb, node, data, value);
#endif
    }