/// <summary>
        /// Adds the specified column to the targeted table only if the column doesn't exist.
        ///
        /// <para>Note: The method automatically resolve the type of the column.</para>
        /// </summary>
        ///
        /// <typeparam name="Table">The Table where we should search for the column type.</typeparam>
        /// <param name="self">The instance of the Cassandra Fluent Migrator helper.</param>
        /// <param name="table">The table to which we want to add the new column.</param>
        /// <param name="column">The new column.</param>
        /// <param name="shouldBeFrozen">Define if the type should be treated as a frozen type or not.</param>
        /// <returns>The Cassandra Fluent Migrator helper.</returns>
        ///
        /// <exception cref="NullReferenceException">Thrown when one or all the specified arguments are invalid or null.</exception>
        /// <exception cref="ObjectNotFoundException">Thrown when the table doesn't exists.</exception>
        public static async Task <ICassandraFluentMigrator> AddColumnAsync <Table>([NotNull] this ICassandraFluentMigrator self, [NotNull] string table, [NotNull] string column, bool shouldBeFrozen = false)
            where Table : class
        {
            Check.NotNull(self, $"The argument [cassandra fluent migrator]");
            Check.NotEmptyNotNull(table, $"The argument [{nameof(table)}]");
            Check.NotEmptyNotNull(column, $"The argument [{nameof(column)}]");

            var typeName = self.GetColumnType <Table>(column, shouldBeFrozen);

            return(await self.ExecuteAddColumnAsync(table, column, typeName));
        }
        /// <summary>
        /// Alter the specified User-Defined type by adding a new column only if it doesn't exist.
        /// If the UDT doesn't exists, the method throws an exception.
        /// If the column exists, the method skips the action.
        /// </summary>
        ///
        /// <typeparam name="TEntity">The calss where the method should search for the properties and their types.</typeparam>
        /// <param name="self">The Cassandra Fluent Migrator.</param>
        /// <param name="udt">The name of the User-Defined type.</param>
        /// <param name="column">The name of the column to be added.</param>
        /// <returns>The Cassandra Fluent Migrator helper.</returns>
        ///
        /// <exception cref="NullReferenceException">Thrown when one or all the specified arguments are invalid or null.</exception>
        /// <exception cref="ObjectNotFoundException">Thrown when the User-Defined type doesn't exists.</exception>
        public static async Task <ICassandraFluentMigrator> AlterUdtAddColumnAsync <TEntity>([NotNull] this ICassandraFluentMigrator self, [NotNull] string udt, string column)
            where TEntity : class
        {
            Check.NotNull(self, $"The argument [cassandra fluent migrator]");

            Check.NotEmptyNotNull(udt, $"The argument [User-Defined type (udt)]");
            Check.NotNull(column, $"The argument [{nameof(column)}]");

            if (self.DoesUdtColumnExists(udt, column))
            {
                return(self);
            }

            var typeName = self.GetColumnType <TEntity>(column);

            return(await self.ExecuteAlterUdtAddColumnQuery(udt, column, typeName));
        }