Vim script で match 文みたいな構文

一応、昨日の続きです。
Vim script で match 文みたいな構文を書いてみました。

[ソース]

function! s:match(...)
    let self = {}
    let self.key = string(a:1)
    let self.map = {}
    
    function! self.case(val, expr)
        let self.map[string(a:val)] = a:expr
        return self
    endfunction

    function! self.default(val)
        try
            return self.apply()
        catch
            return a:val
        endtry
    endfunction
    
    function! self.apply()
        return self.eval(self.map[self.key])
    endfunction
    
    function! self.eval(expr)
        return a:expr
    endfunction

    return self
endfunction


function! s:main()

    for n in range(1, 30)
        echo s:match([n%3==0, n%5==0])
            \.case([1,0], "Fizz")
            \.case([0,1], "Buzz")
            \.case([1,1], "FizzBuzz")
            \.default(n)
    endfor

endfunction
call s:main()

[出力]

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

チェーンメソッドで記述して、なんとなくそれっぽい感じにはなっていると思います。
最後に apply を呼ぶのがめんどくさかったので、default() 内で match 文の評価を行っています。
しかし、改行毎に \ を書くのが若干手間なのと、式を評価できないのがちと悲しいですね…。
まぁ簡単な式であれば、文字列で定義して、eval や execute で評価してもいいんですけども。
もっといい書き方があるかしら。
あと case 以外にも type とかがあってもいいかな。