LINUX.ORG.RU

Как правильно вызвать оригинальный метод родителя из потомка?

 , ,


0

1

Хочу переопределить метод send класса Zabbix::Sender (наследующего Moose::Object'у). Делаю так, и оно так работает:

#!/usr/bin/perl
package Zabbix::Sender::Clever;
use 5.16.1;
use Moose;
extends 'Zabbix::Sender';

has 'debug' => (
    'is'    => 'rw',
    'isa'   => 'Bool',
    'default' => 0,
);

has 'dryrun' => (
    'is'    => 'rw',
    'isa'   => 'Bool',
    'default' => 0,
);
         
sub send {
  my $self=shift;
  my $item={'key'=>$_[0],'val'=>$_[1]};
  printf STDERR "Feeding item <<%s>> on host <<%s>> with value <<%s>>\n", $item->{'key'}, $self->hostname, $item->{'val'} if $self->debug;
  unless ($self->dryrun) {
    Zabbix::Sender::send($self, @_);
    say 'INFO: '.$self->_info;
  }
  
}

package main;
my $z=Zabbix::Sender::Clever->new('server'=>'localhost');
$z->dryrun(0);
$z->debug(1);

$z->send('item.key','hello');

Но... Сугубо ИМХО это как-то немного уродливо смотрится вызов метода родителя «Zabbix::Sender::send($self, @_);». В конце-концов внутри меодов наследующего я хотя могу забыть о конкретном имени класса родителя и написать хотя бы просто __PARENT__::send($self) ?

А в идеале хотелось бы чего-то вроде $self->PARENT->send();

Есть ли такие красивости в Moose? Что-то не нашёл...

★★★★★

Ответ на: RTFM от Olegymous

Спасибо огромное!

Переписал код, теперь выглядит куда симпатичнее:

#!/usr/bin/perl
package Zabbix::Sender::Clever;
use feature 'say';
use Moose;
extends 'Zabbix::Sender';

has 'debug' => (
    'is'    => 'rw',
    'isa'   => 'Bool',
    'default' => 0,
);

has 'dryrun' => (
    'is'    => 'rw',
    'isa'   => 'Bool',
    'default' => 0,
);

sub send {
  my $self=shift;
  my $item={'key'=>$_[0],'val'=>$_[1]};
  printf STDERR "Feeding item <<%s>> on host <<%s>> with value <<%s>>\n",
                $item->{'key'}, $self->hostname, $item->{'val'}
    if $self->debug;
  unless ($self->dryrun) {
    $self->SUPER::send(@_);
    say 'INFO: '.$self->_info;
  }

}

package main;
my $z=Zabbix::Sender::Clever->new(
  'server'=>'localhost',
  'hostname'=>'my-site.domain.com',
  'dryrun'=>0,
  'debug'=>1
);

$z->send('item.key','hello');
DRVTiny ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.