或者:有没有一种标准的方法来创建子类,但是在调用时,使超类中的某些方法产生“无法定位对象方法”错误?
例如,如果My::Foo
继承自My::Bar
,而My::Bar
有一个名为dostuff
的方法,则调用Foo->new->dostuff
将会死于“不能找到对象方法“以某种非人为/ hackish方式出错。
答案 0 :(得分:5)
如果超类是Moose类,你可以使用remove_method。
package My::Foo;
use Moose;
extends 'My::Bar';
# some code here
my $method_name = 'method_to_remove';
__PACKAGE__->meta->remove_method($method_name);
1;
这在Class::MOP::Class中有记录,应与MooseX::NonMoose一起使用,但我不确定。
答案 1 :(得分:5)
您可以在子类中创建拦截方法调用和死亡的伪方法。
package My::Foo;
our @ISA = 'My::Bar';
use Carp ();
for my $method qw(dostuff ...) {
no strict 'refs';
*$method = sub {Carp::croak "no method '$method' on '$_[0]'"};
}
您甚至可以编写一个模块来执行此操作:
package No::Method;
use Carp ();
sub import {
my $class = shift;
my $caller = caller;
for my $method (@_) {
no strict 'refs';
*{"$caller\::$method"} = sub {
Carp::croak "no method '$method' on '$_[0]'"
};
}
}
然后使用它:
package My::Foo;
our @ISA = 'My::Bar';
use No::Method qw(dostuff);
答案 2 :(得分:1)