外部リソースにリンクされているクラスを書いています。メソッドの1つは、外部リソースを破棄するdeleteメソッドです。そのオブジェクトに対してそれ以上のメソッド呼び出しを行うべきではありません。フラグを設定して、フラグが設定されている場合はすべてのメソッドの内部で死ぬことを考えていましたが、より良い、より簡単な方法はありますか?多分破壊を含む何か?
これまでのところ、私はAxemanの提案が本当に好きですが、すべてのメソッドを再作成するには怠惰すぎるため、AUTOLOADを使用しています。
#!/usr/bin/perl
use strict;
use warnings;
my $er = ExternalResource->new;
$er->meth1;
$er->meth2;
$er->delete;
$er->meth1;
$er->meth2;
$er->undelete;
$er->meth1;
$er->meth2;
$er->delete;
$er->meth1;
$er->meth2;
$er->meth3;
package ExternalResource;
use strict;
use warnings;
sub new {
my $class = shift;
return bless {}, $class;
}
sub meth1 {
my $self = shift;
print "in meth1\n";
}
sub meth2 {
my $self = shift;
print "in meth2\n";
}
sub delete {
my $self = shift;
$self->{orig_class} = ref $self;
return bless $self, "ExternalResource::Dead";
}
package ExternalResource::Dead;
use strict;
use Carp;
our $AUTOLOAD;
BEGIN {
our %methods = map { $_ => 1 } qw/meth1 meth2 delete new/;
}
our %methods;
sub undelete {
my $self = shift;
#do whatever needs to be done to undelete resource
return bless $self, $self->{orig_class};
}
sub AUTOLOAD {
my $meth = (split /::/, $AUTOLOAD)[-1];
croak "$meth is not a method for this object"
unless $methods{$meth};
carp "can't call $meth on object because it has been deleted";
return 0;
}