public function check(string $key, int $capacity, int $seconds, int $cost = 1): bool
	{
		$tokenName = $this->prefix . $key;

		// Check to see if the bucket has even been created yet.
		if (($tokens = $this->cache->get($tokenName)) === false)
		{
			// If it hasn't been created, then we'll set it to the maximum
			// capacity - 1, and save it to the cache.
			$this->cache->save($tokenName, $capacity - $cost, $seconds);
			$this->cache->save($tokenName . 'Time', time());

			return true;
		}

		// If $tokens > 0, then we need to replenish the bucket
		// based on how long it's been since the last update.
		$throttleTime = $this->cache->get($tokenName . 'Time');
		$elapsed      = $this->time() - $throttleTime;
		// Number of tokens to add back per second
		$rate = $capacity / $seconds;

		// We must have a minimum wait of 1 second for a new token
		// Primarily stored to allow devs to report back to users.
		$this->tokenTime = max(1, $rate);

		// Add tokens based up on number per second that
		// should be refilled, then checked against capacity
		// to be sure the bucket didn't overflow.
		$tokens += $rate * $elapsed;
		$tokens  = $tokens > $capacity ? $capacity : $tokens;

		// If $tokens > 0, then we are save to perform the action, but
		// we need to decrement the number of available tokens.
		$response = false;

		if ($tokens > 0)
		{
			$response = true;

			$this->cache->save($tokenName, $tokens - $cost, $elapsed);
			$this->cache->save($tokenName . 'Time', time());
		}

		return $response;
	}