I think this discussion is pointless. You either provide an interface to your module---then you decide if it supports can()---or you implement an interface another module expects---then the author of that module decided if can() is needed. That's it.
Implementing a working can() isn't that hard. I'd say this should work (ATTN: untested, WILL contain syntax errors):
sub can {
my ($self, $what, $code) = (@_[0,1], undef);
return $code if $code = $self->UNIVERSAL::can($what);
return $code if $code = $self->_can($what);
foreach my $superclass (@ISA) {
return $code if $code = eval "\$self->${superclass}::can(\$wha
+t)";
}
return undef;
}
sub _can { # aka _load()
my ($self, $what) = @_;
if ($what eq 'foo') {
return sub {'foo'};
} else {
return undef;
}
}
sub AUTOLOAD {
my ($self, $code) = ($_[0], undef);
goto &$code if $code = $self->can($AUTOLOAD);
die "oops";
}
PS: This even provides a working way for using AUTOLOAD with multi-inheritance, I'd say.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
|
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.
|
|