note
tobyink
<p>Don't use an abstract base class; use roles...</p>
<c>
{
package IAmNotInYourIsa;
use Moose::Role;
requires 'dothis';
}
{
package My::CGI;
use Moose; with 'IAmNotInYourIsa';
use CGI;
sub dothis { ... my $q = CGI->new ... $q->param ... }
}
My::CGI->isa('IAmNotInYourIsa'); # false
My::CGI->does('IAmNotInYourIsa'); # true!
</c>
<p>A good example can be seen in the <a href="https://metacpan.org/release/Ask">Ask</a> distribution on CPAN, where there are different implementations for <a href="https://metacpan.org/module/Ask::STDIO">STDIN/STDOUT</a>, <a href="https://metacpan.org/module/Ask::Tk">Tk</a>, etc, each of which include:</p>
<c>
with 'Ask::API';
</c>
<p>Ask uses <a href="https://metacpan.org/module/Moo">Moo</a> rather than Moose, but the principle is the same.</p>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-757127">
<small><small>
<tt>perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
</tt></small></small>
</div></div>
1010362
1010362