There's perhaps no better illustration of the values of roles vs
inheritance in CPAN modules than the mess than that the LWP inheritance
tree.

There's so many modules that extend LWP or Mechanize through
sub-classing, but can't easily be combined with getting into diamond
inheritance:

Here's a sampling of LWP subclasses:

    WWW::Mechanize
    LWP::UserAgent::POE
    Test::LWP::UserAgent
    LWP::UserAgent::Cached
    LWP::UserAgent::ProxyAny;
    LWP::UserAgent::Snapshot;
    LWP::UserAgent::Keychain;
    LWP::Parallel::UserAgent;
    LWP::UserAgent::Determined;

Then you have the WWW::Mechanize sub-classes. Here's a sampling:

    Test::WWW::Mechanize
    WWW::Mechanize::Query
    WWW::Mechanize::Cached
    WWW::Scripter

Now, if you'd like to combine one of these of the features extensions
from any these, good luck! Trial-and-error, and possible @ISA-hacking
lie ahead of you. Maybe you'll find a valid combination. Maybe not.

Now, if the extensions were written as roles, combining the extensions
would be. There could still be conflicts and incompatibilities, but I
think things would be far more likely to present themselves up front.

Perhaps if some of these get converted to extend-by-roles instead of
extend-by-inheritance, some others will follow along, and we'll end up
with a more useful of collection of Perl-based browser extensions.

   Mark

Reply via email to