"strict::can" is a module which, if used, imports a "can" method into your namespace. This version of can() will not report imported helper functions or "private" methods. Full docs below.
Comments and suggestions welcome. Cheers, Ovid -- NAME strict::can - Make can() ignore private methods and imported subroutines VERSION Version 0.01 SYNOPSIS package Foo; use strict::can; use HTML::Entities qw(encode_entities); # imported into Foo:: sub new { bless {}, shift } sub _private { 'some private function' } # later Foo->can('new'); # true Foo->can('encode_entities'); # false (because it's an imported function) Foo->can('_private'); # false (because it's a private function, even # though we can still call it) EXPORT This module exports a "can()" method into your namespace. DESCRIPTION This module gives your classes a "can()" method which overrides (not replaces) "UNIVERSAL::can". In most respects it behaves like you expect it should, but does not report private methods (see below) or imported functions. Imported functions Frequently we import helper functions into our namespace. Ordinarily "can()" will return the code reference for these functions even though this is probably not what we want. "strict::can" will return false for any imported functions/methods. If you want to expose them, write wrapper methods for them. { package Foo; use strict::can; use HTML::Entities qw/encode_entities/; # import into Foo:: ... sub encode { my ($self, @args) = @_; return encode_entities(@args); } } # later if (Foo->can('encode_entities')) { # never gets to here } Private methods Methods which begin with an underscore are, by convention, considered "private" and should not be relied on. Unfortunately, "can()" succeeds with those, too. "strict::can" will return false for private methods unless the class checking "can()" is a *subclass* of the class or instance it is checking. This is because we're allowing a little more trust for subclasses as "private" methods are often "protected" methods which subclasses should be allowed to use. { package Foo; use strict::can; ... sub _private { return 'Top Sekret!'; } } # later { package main; if (Foo->can('_private')) { # never gets to here } } { package Foo::Bar; our @ISA = qw(Foo); if (Foo->can('_private')) { # success at last! } } AUTHOR Curtis "Ovid" Poe, "<[EMAIL PROTECTED]>" BUGS Please report any bugs or feature requests to "[EMAIL PROTECTED]", or through the web interface at <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=strict-can>. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. SEE ALSO The "B::svref_2object" function. COPYRIGHT & LICENSE Copyright 2005 Curtis "Ovid" Poe, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. -- If this message is a response to a question on a mailing list, please send follow up questions to the list. Web Programming with Perl -- http://users.easystreet.com/ovid/cgi_course/