namespace ProtoBuf
{
    /// <summary>
    /// Indicates that the implementing type has support for protocol-buffer
    /// <see cref="IExtension">extensions</see>.
    /// </summary>
    /// <remarks>Can be implemented by deriving from Extensible.</remarks>
    public interface IExtensible
    {
        /// <summary>
        /// Retrieves the <see cref="IExtension">extension</see> object for the current
        /// instance, optionally creating it if it does not already exist.
        /// </summary>
        /// <param name="createIfMissing">Should a new extension object be
        /// created if it does not already exist?</param>
        /// <returns>The extension object if it exists (or was created), or null
        /// if the extension object does not exist or is not available.</returns>
        /// <remarks>The <c>createIfMissing</c> argument is false during serialization,
        /// and true during deserialization upon encountering unexpected fields.</remarks>
        IExtension GetExtensionObject(bool createIfMissing);
    }
}