public function parse($request, array $options = []) {
		$defaults = ['url' => $request->url];
		$options += $defaults;
		$url = '/' . trim($options['url'], '/');
		$pattern = $this->_pattern;

		if (!preg_match($pattern, $url, $match)) {
			return false;
		}
		foreach ($this->_meta as $key => $compare) {
			$value = $request->get($key);

			if (!($compare == $value || (is_array($compare) && in_array($value, $compare)))) {
				return false;
			}
		}
		foreach ($this->_config['modifiers'] as $key => $modifier) {
			if (isset($match[$key])) {
				$match[$key] = $modifier($match[$key]);
			}
		}

		$result = array_intersect_key($match + ['args' => []], $this->_keys);
		foreach ($result as $key => $value) {
			if ($value === '') {
				unset($result[$key]);
			}
		}
		$result += $this->_params + $this->_defaults;
		$request->params = $result + (array) $request->params;
		$request->persist = array_unique(array_merge($request->persist, $this->_persist));

		if ($this->_handler) {
			$handler = $this->_handler;
			return $handler($request);
		}
		return $request;
	}