I am writing a file manager for my Perl application. Information about each file is kept as an object. When I remove a file, I'd like to change the corresponding object's class to RemovedFile. For this class, call to any valid method of "File" would return a fatal error and a stack trace. This would be to catch cases where some stale reference to this object is kept (while it shouldn't).
I thought about two ways I could implement this:
"RemovedFile" inherits from "File" and redefines all its methods with a call to fatal error. Downside to this is that if I add a new method to "File" I need to add it to "RemovedFile" as well.
Adding a call to some empty method to every method of "File". "RemovedFile" would redefine this one method to report fatal error. (See code below for an example of what I mean). Downside to this is that every method of "File" would have to be bothered with calling the "remove_guard" in the beginning which IMO is not very clean.
# Inside File class:
sub any_method_of_file_class {
$self->_removed_guard();
#rest of code
}
sub _removed_guard {
#do nothing
}
# Inside RemovedFile class redefine only _removed_guard:
sub _removed_guard {
$self->{logger}->fatal_with_stack_trace();
}
I wanted to ask if there is any better way to implement this kind of behaviour in Perl? For example, could I use some tricks to first list and then dynamically redefine all methods of a parent class without specifying their exact names?