public function matches($filter, $topic)
    {
        // Created by Steffen (https://github.com/kernelguy)
        $tokens = explode('/', $filter);
        $parts = [];
        for ($i = 0, $count = count($tokens); $i < $count; ++$i) {
            $token = $tokens[$i];
            switch ($token) {
                case '+':
                    $parts[] = '[^/#\+]*';

                    break;
                case '#':
                    if ($i === 0) {
                        $parts[] = '[^\+\$]*';
                    } else {
                        $parts[] = '[^\+]*';
                    }

                    break;
                default:
                    $parts[] = str_replace('+', '\+', $token);

                    break;
            }
        }

        $regex = implode('/', $parts);
        $regex = str_replace('$', '\$', $regex);
        $regex = ';^'.$regex.'$;';

        return preg_match($regex, $topic) === 1;
    }