original_string: public static function addDecoder(string $class, string ...$contentTypes)
      {
          $interface = decoder\DecoderInterface::class;
          if (!is_subclass_of($class, $interface)) {
              throw new \InvalidArgumentException(
                  "invalid value provided for 'class'; ".
                  "expecting the name of a class that implements '$interface'"
              );
          }
  
          foreach ($contentTypes as $type) {
              static::$decoders[$class] = $type;
          }
      }
code: public static function addDecoder(string $class, string ...$contentTypes)
      {
          $interface = decoder\DecoderInterface::class;
          if (!is_subclass_of($class, $interface)) {
              throw new \InvalidArgumentException(
                  "invalid value provided for 'class'; ".
                  "expecting the name of a class that implements '$interface'"
              );
          }
  
          foreach ($contentTypes as $type) {
              static::$decoders[$class] = $type;
          }
      }
code_tokens: public static function addDecoder ( string $ class , string ... $ contentTypes ) { $ interface = decoder \ DecoderInterface :: class ; if ( ! is_subclass_of ( $ class , $ interface ) ) { throw new \ InvalidArgumentException ( "invalid value provided for 'class'; " . "expecting the name of a class that implements '$interface'" ) ; } foreach ( $ contentTypes as $ type ) { static :: $ decoders [ $ class ] = $ type ; } }
docstring: Replace existing decoders, or add additional decoders
  
  @param string $class The nme of the decoder class
  @param string ...$contentTypes The content types the decoder can handle
docstring_tokens: Replace existing decoders or add additional decoders