roles never show up in the mro
get_submethod already returns undef if it doesn't exist
simplify
method caching