public static function group(array $properties, array $routes)
    {
        // Translate a single filter to an array of one filter
        if (isset($properties['filter'])) {
            if (!is_array($properties['filter'])) {
                $properties['filter'] = [$properties['filter']];
            }
        } else {
            $properties['filter'] = [];
        }

        $baseProperties = ['prefix' => '', 'rprefix' => ''];
        $properties = array_merge($baseProperties, $properties);

        // $routes: [0] = HTTP method, [1] = pattern, [2] = controller/method route
        foreach ($routes as $route) {
            $httpmethod = $route[0];

            if (!method_exists(__CLASS__, $httpmethod)) {
                continue;
            }

            $pattern = $properties['prefix'].$route[1];
            $callback = $properties['rprefix'].$route[2];
            $options = [
                'filter' => $properties['filter']
            ];
            self::$httpmethod($pattern, $callback, $options);
        }
    }