Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在每次调用object';什么方法?_Perl_Oop_Methods - Fatal编程技术网

Perl 如何在每次调用object';什么方法?

Perl 如何在每次调用object';什么方法?,perl,oop,methods,Perl,Oop,Methods,我想在每次调用我的对象的方法时检查一些值(在本例中:token的年龄)。是否可以同时将其设置为所有方法?比如在构造器中?我有这么简单的构造器: sub new { my $class = shift; my %args = @_; my $self = {}; $self->{key} = $args{key}; bless($self, $class); ($self->{token}, $self->{token_sta

我想在每次调用我的对象的方法时检查一些值(在本例中:token的年龄)。是否可以同时将其设置为所有方法?比如在构造器中?我有这么简单的构造器:

sub new {
    my $class = shift;
    my %args = @_;
    my $self  = {};

    $self->{key} = $args{key};
    bless($self, $class);

    ($self->{token}, $self->{token_start}) = $self->_get_authorized_token(); 
    return $self;
}
还有一系列方法,取决于令牌的使用年限,如下所示:

sub add_item {
    my $self = shift;
    my %args = @_;
    ...
}

我希望避免在每个方法中都包含年龄检查,所以我寻找更通用的方法来实现它。有一些吗?

我能想到的就是隐藏你所有的“真实”方法——要么用经典的方式加上一个下划线,要么用一堆子例程——然后使用
自动加载
正确地引导调用

下面的例子说明了这一点

模块MyClass.pm

package MyClass;

use strict;
use warnings;

sub new {
  bless {}, __PACKAGE__;
}

sub _method1 {
  print "In method1\n";
}

sub _method2 {
  print "In method2\n";
}

sub AUTOLOAD {

  our $AUTOLOAD;

  my ($class, $method) = $AUTOLOAD =~ /(.+)::(.+)/;
  return if $method eq 'DESTROY';

  my $newmethod = "${class}::_$method";
  unless (exists &$newmethod) {
    die qq(Can't locate object method "$method" via package "$class");
  }

  print "Preprocessing...\n";
  goto &$newmethod 
}

1;
节目

use strict;
use warnings;

use MyClass;

my $thing = MyClass->new;

$thing->method1;
$thing->method2;
$thing->method3;
输出

Preprocessing...
In method1
Preprocessing...
In method2
Can't locate object method "method3" via package "MyClass" at MyClass.pm line 23.

请参阅或模块。

我真诚地认为,如果您正在使用Perl进行OO,并且希望在不使用样板文件的情况下处理属性、方法修饰符和延迟资源加载等问题,那么值得投资学习。举例来说,这是使用Moose编写所需内容的一种方法:

use Moose;
has key => (isa => 'Str', is => 'ro');
has token => (isa => 'HashRef', is => 'ro', lazy_build => 1);

before [qw(add_item method2 method3)] => sub {
    my $self = shift;
    if (do something with $self->token) {
         # return, die, etc.
    }
};

sub _build_token {
    my $self = shift;
    my $key = $self->key;
    return { token => 'foo', token_start => time };
}
这些可能会有所帮助:


感谢您提供正确的路径-方法修改器!我甚至不知道该找什么。