有没有一种标准的方法可以从Perl超类中有选择地继承方法?

时间:2011-03-24 17:19:28

标签: perl oop inheritance

或者:有没有一种标准的方法来创建子类,但是在调用时,使超类中的某些方法产生“无法定位对象方法”错误?

例如,如果My::Foo继承自My::Bar,而My::Bar有一个名为dostuff的方法,则调用Foo->new->dostuff将会死于“不能找到对象方法“以某种非人为/ hackish方式出错。

3 个答案:

答案 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)

这完全取决于构建My :: Bar和My :: Foo的方式。如果它们是您的模块,您可能需要查看Exporter.

您还可以从类中导入选择函数:

use POSIX qw{setsid};