def METHOD_NAME(self, METHOD_NAME: Callable[[str], None], prompt: str = '', screen_cols: int = 0) -> None:
    if self.pending_bell:
        METHOD_NAME('\a')
        self.pending_bell = False
    ci = self.current_input
    if self.is_password:
        ci = '*' * wcswidth(ci)
    text = prompt + ci
    cursor_pos = self.cursor_pos + wcswidth(prompt)
    if screen_cols:
        METHOD_NAME(SAVE_CURSOR + text + RESTORE_CURSOR)
        used_lines, last_line_cursor_pos = divmod(cursor_pos, screen_cols)
        if used_lines == 0:
            if last_line_cursor_pos:
                METHOD_NAME(move_cursor_by(last_line_cursor_pos, 'right'))
        else:
            if used_lines:
                METHOD_NAME(move_cursor_by(used_lines, 'down'))
            if last_line_cursor_pos:
                METHOD_NAME(move_cursor_by(last_line_cursor_pos, 'right'))
    else:
        METHOD_NAME(text)
        METHOD_NAME('\r')
        if cursor_pos:
            METHOD_NAME(move_cursor_by(cursor_pos, 'right'))
        METHOD_NAME(set_cursor_shape('beam'))