/**
     * Outputs the role level meta box.
     *
     * @since  1.0.0
     * @access public
     * @param  object  $role
     * @return void
     */
    public function meta_box($role)
    {
        // If the role isn't editable, the field should be read-only.
        $is_editable = $role ? members_is_role_editable($role->name) : true;
        $readonly = $is_editable ? '' : ' disabled="disabled" readonly="readonly"';
        // Get the role level.
        $role_level = mrl_get_role_level($role);
        // If there is no role level, check if cloning or error.
        if (!$role_level) {
            // If there was a posted level (error).
            if (isset($_POST['mrl-role-level']) && mrl_is_valid_level($_POST['mrl-role-level'])) {
                $role_level = $_POST['mrl-role-level'];
            } else {
                if (isset($_GET['page']) && 'role-new' === $_GET['page'] && !empty($_GET['clone'])) {
                    $role_level = mrl_get_role_level(members_sanitize_role($_GET['clone']));
                }
            }
        }
        // If still no level, set it to `level_0`.
        $role_level = $role_level ? $role_level : 'level_0';
        wp_nonce_field('role_level', 'mrl_role_level_nonce');
        ?>

		<p>
			<select class="widefat" name="mrl-role-level"<?php 
        echo $readonly;
        ?>
>

				<?php 
        foreach (mrl_get_role_levels() as $level => $label) {
            ?>

					<option value="<?php 
            echo esc_attr($level);
            ?>
" <?php 
            selected($level, $role_level);
            ?>
><?php 
            echo esc_html($label);
            ?>
</option>

				<?php 
        }
        ?>

			</select>
		</p>
	<?php 
    }
/**
 * Sets a new role level. This function also updates all users of the given role to update
 * their user level.
 *
 * Note: WP will always set the user level to the highest level when calling the
 * `WP_User:update_user_level_from_caps()` method, so there's no need to check for the
 * highest role when dealing with users with multiple roles.
 *
 * @since  1.0.0
 * @access public
 * @param  string|object $role
 * @return void
 */
function mrl_set_role_level($role, $new_level = 'level_0')
{
    // Make sure we have the role object.
    if (!is_object($role)) {
        $role = get_role($role);
    }
    // Get the allowed levels.
    $levels = array_keys(mrl_get_role_levels());
    // Get the posted level without the `level` prefix.
    $new_level_numeric = absint(mrl_remove_level_prefix($new_level));
    // Get the levels to add and remove.
    $add = array_slice($levels, 0, $new_level_numeric + 1, true);
    $remove = array_diff($levels, $add);
    // Add new levels.
    foreach ($add as $add_level) {
        $role->add_cap($add_level);
    }
    // Remove levels.
    foreach ($remove as $remove_level) {
        $role->remove_cap($remove_level);
    }
    // Get the users with the current role.
    $users = get_users(array('role' => $role->name));
    // If there are users with the role, update their user level from caps.
    if ($users) {
        foreach ($users as $user) {
            $user->update_user_level_from_caps();
        }
    }
}