a thing I like to do is put a leading underscore on methods that should not be called directly e.g.
...
sub external {
...
_internal();
...
}
sub _internal {
}
this is just a hint to the class user, of course. I also do the same for function-style modules, I put required methods in EXPORT, internal functions in EXPORT_OK, and provide :std and :test tags in EXPORT_TAGS that are EXPORT and EXPORT_OK e.g.
@EXPORT = qw(external interface);
@EXPORT_OK = qw(_internal _interface);
%EXPORT_TAGS = (STD => \@EXPORT,
TEST => \@EXPORT_OK);