public function map($method, string $route, string $action, string $controller)
    {
        // alias
        $proxy = $this->proxy_factory;

        if (!\is_array($method)) {
            $method = [(string)$method];
        }

        // whitelist http methods
        \array_walk($method, function ($v) {
            if (!\in_array($v, ['GET', 'POST', 'PUT', 'DELETE'])) {
                throw new \InvalidArgumentException(\sprintf('Unknown http method: "%s"', $v));
            }
        });

        foreach ($method as $m) {
            $this->klein->respond($m, $route, function ($request, $response) use (&$proxy, $action, $controller) {

                return $proxy($controller)
                        ->setRequest($request)
                        ->setResponse($response)
                        ->$action();

            });
        }

        return $this;
    }