/// <summary>
        /// Modifies a strongly typed extension contained in the extensible object. Will create the strongly typed extension if it doesn't already exist.
        /// </summary>
        /// <typeparam name="T">Type of extensible object</typeparam>
        /// <typeparam name="TExtension">Type of extension</typeparam>
        /// <param name="extensibleObject">The CLR extensible object to execute the extension method on.</param>
        /// <param name="modifyExtensionAction">Modification to perform on the strongly typed extension object.</param>
        public static void ModifyExtension <T, TExtension>(this IExtensibleObject <T> extensibleObject, Action <TExtension> modifyExtensionAction)
            where T : IExtensibleObject <T>
            where TExtension : IExtension <T>, new()
        {
            Contract.Requires(extensibleObject != null);
            Contract.Requires(modifyExtensionAction != null);

            // Add extension if it does not already exist.
            TExtension extension;

            var extensionType = typeof(TExtension);

            if (extensibleObject.TryGetExtension(extensionType, out var extensionAsInterface))
            {
                extension = (TExtension)extensionAsInterface;
            }
            else
            {
                extension = new TExtension();
                extensibleObject.AddExtension(extension);
            }

            // Modify either the existing or new extension object.
            modifyExtensionAction(extension);
        }
        /// <summary>
        /// Gets an extension by extension CLR type from the extensible object. An exception is thrown if the extension does not exist.
        /// </summary>
        /// <param name="extensibleObject">The CLR extensible object to execute the extension method on.</param>
        /// <param name="extensionType">The CLR extension type to get from the extensible object.</param>
        /// <returns>Extension object contained in the extensible object.</returns>
        public static IExtension <T> GetExtension <T>(this IExtensibleObject <T> extensibleObject, Type extensionType)
            where T : IExtensibleObject <T>
        {
            Contract.Requires(extensibleObject != null);
            Contract.Requires(extensionType != null);

            if (extensibleObject.TryGetExtension(extensionType, out var extension))
            {
                return(extension);
            }

            var message = $"{extensibleObject.GetType().Name} has missing extension [type={extensionType.Name}]. Ensure extensible object contains extension [type={extensionType.Name}] or use the TryGetExtension method if the extension is optional.";

            throw new InvalidOperationException(message);
        }
        /// <summary>
        /// Try and get the strongly typed extension by extension CLR type from the extensible object. Returns true if the extension exists, false otherwise.
        /// </summary>
        /// <typeparam name="T">Type of extensible object</typeparam>
        /// <typeparam name="TExtension">Type of extension</typeparam>
        /// <param name="extensibleObject">The CLR extensible object to execute the extension method on.</param>
        /// <param name="extension">Output parameter to capture the strongly typed extension if it exists in the extensible object.</param>
        /// <returns>True if the extension exists in the extensible object, false otherwise.</returns>
        public static bool TryGetExtension <T, TExtension>(this IExtensibleObject <T> extensibleObject, out TExtension extension)
            where T : IExtensibleObject <T>
            where TExtension : IExtension <T>
        {
            Contract.Requires(extensibleObject != null);

            var extensionType = typeof(TExtension);

            if (extensibleObject.TryGetExtension(extensionType, out var extensionAsInterface))
            {
                extension = (TExtension)extensionAsInterface;
                return(true);
            }

            extension = default(TExtension);
            return(false);
        }
        /// <summary>
        /// Creates a strongly typed extension and adds it to the extensible object if it doesn't already exist. Does nothing if it already exists.
        /// </summary>
        /// <typeparam name="T">Type of extensible object</typeparam>
        /// <typeparam name="TExtension">Type of extension</typeparam>
        /// <param name="extensibleObject">The CLR extensible object to execute the extension method on.</param>
        public static void CreateExtension <T, TExtension>(this IExtensibleObject <T> extensibleObject)
            where T : IExtensibleObject <T>
            where TExtension : IExtension <T>, new()
        {
            Contract.Requires(extensibleObject != null);

            // Install new extension if it does not already exist.
            var extensionType = typeof(TExtension);

            if (extensibleObject.TryGetExtension(extensionType, out var extension))
            {
                return;
            }

            extension = new TExtension();
            extensibleObject.AddExtension(extension);
        }