Существует ли стандартный способ выборочного наследования методов от суперкласса Perl? - PullRequest
2 голосов
/ 24 марта 2011

Или: существует ли стандартный способ создания подкласса, но при этом определенные методы из суперкласса выдают ошибку «Не удается найти метод объекта» при вызове?

Например, если My::Foo наследуется от My::Bar, а My::Bar имеет метод с именем dostuff, то вызов Foo->new->dostuff умрет с ошибкой «Can't locate object method» в некоторых ненастроенных / Хакерский путь.

Ответы [ 3 ]

5 голосов
/ 24 марта 2011

Вы можете создать в своем дочернем классе фиктивные методы, которые перехватывают вызовы методов и умирают.

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);
5 голосов
/ 24 марта 2011

Если суперкласс является классом 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 голос
/ 24 марта 2011

Это полностью зависит от того, как построены My :: Bar и My :: Foo. Если они являются вашими модулями, вы можете посмотреть Exporter.

Вы также можете импортировать функции выбора из класса следующим образом:

use POSIX qw{setsid}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...