add support for sub-menus
refactor (-> map/filter vec) => mapv/filterv