Term::Shell::Enhanced (T::S::E) lets you write commandline shell frameworks.
Term::Shell (T::S) is great, yet T::S::E tops it and adds more convenience features.
Compared to T::S it feels more like a real shell (builtin cd, pwd, echo, control of environment variables, history files).
Because of its features, T::S::E requires quite a lot modules. If this is an issue stick to T::S.
Whenever I have complex applications to maintain, I write a T::S::E shell.