because I am too lazy, now also support "fn"