public function diff($it, $mode = self::VALUE) {
    switch ($mode) {
      case self::KEY:
        return Splash::go()->append(new \ArrayIterator(array_diff_key($this->toArray(), (array) $it)));

      case self::KEY_ARRAY:
        return Splash::go()->append(new \ArrayIterator(array_diff_key($this->toArray(), array_fill_keys((array) $it, NULL))));

      case self::VALUE:
        return Splash::go()->append(new \ArrayIterator(array_diff($this->toArray(), (array) $it)));

      case self::KEYVALUE:
        return Splash::go()->append(new \ArrayIterator(array_diff_assoc($this->toArray(), (array) $it)));

      default:
        throw new \InvalidArgumentException("Requested diff mode is unsupported.");
    }
  }