Oh, several reasons. Most of all, it does some things I think were a major mistake, like trying to determine whether a sub is called as a function or as a method, at runtime.
Furthermore, it has its own "optimization" using AUTOLOAD, defining sub definitions as strings and evalling them at runtime when the sub is first called. Again, it's not something I want to see in every module.
Leave out those major stumbling blocks (for me anyway), and you do get some readable code, I agree. But the module is still too big for its own good.
I'm quite convinced there must be many much better examples of modules to use as a model on how to do things.