public function before($expression = null, $test = false, $limit = LIMIT_BEFORE) {
			if (isset($this->before) && $limit == LIMIT_BEFORE) {
				$before = $this->before;
			}

			else {
				$limit = max(0, $this->begin - $limit);
				$before = substr($this->data, $limit, $this->begin - $limit);
				$this->before = $before;
			}

			if ($test === false) {
				if ($expression === null) {
					return new Token($before, $this->begin);
				}

				preg_match($expression, $before, $match, PREG_OFFSET_CAPTURE);

				if (!isset($match[0][0]) || !isset($match[0][1])) return null;

				return new Token($match[0][0], $match[0][1] + $limit);
			}

			else {
				if ($expression === null) {
					return $this->begin > 0;
				}

				return (boolean)preg_match($expression, $before);
			}
		}