code: def color(
              self, text=None, fore=None, back=None, style=None,
              no_closing=False):
          
          has_args = (
              (fore is not None) or
              (back is not None) or
              (style is not None)
          )
          if hasattr(text, '__colr__') and not has_args:
              # Use custom __colr__ method in the absence of arguments.
              return str(self._call_dunder_colr(text))
  
          # Stringify everything before operating on it.
          text = str(text) if text is not None else ''
          if _disabled:
              return text
  
          # Considered to have unclosed codes if embedded codes exist and
          # the last code was not a color code.
          embedded_codes = get_codes(text)
          has_end_code = embedded_codes and embedded_codes[-1] == closing_code
          # Add closing code if not already added, there is text, and
          # some kind of color/style was used (whether from args, or
          # color codes were included in the text already).
          # If the last code embedded in the text was a closing code,
          # then it is not added.
          # This can be overriden with `no_closing`.
          needs_closing = (
              text and
              (not no_closing) and
              (not has_end_code) and
              (has_args or embedded_codes)
          )
          if needs_closing:
              end = closing_code
          else:
              end = ''
          return ''.join((
              self.color_code(fore=fore, back=back, style=style),
              text,
              end,
          ))
docs: A method that colorizes strings, not Colr objects.
              Raises InvalidColr for invalid color names.
              The 'reset_all' code is appended if text is given.