如何在每次调用对象方法时检查一些值?

时间:2012-08-10 14:21:45

标签: perl oop methods

我想检查每次调用我的对象的方法的某些值(在这种情况下:令牌的年龄)。是否可以立即将其设置为所有方法?喜欢在构造函数中?我有这么简单的构造函数:

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 = @_;
    ...
}

我想避免在每种方法中包含年龄检查,所以我寻找更一般的方法来实现它。有没有?

3 个答案:

答案 0 :(得分:3)

我所能想到的就是隐藏所有'真实'方法 - 无论是使用前面的下划线的经典方式,还是隐藏在子程序中 - 并使用AUTOLOAD来正确指导调用。

以下示例提出了这个想法

模块 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.

答案 1 :(得分:1)

答案 2 :(得分:1)

老实说,如果你在Perl中做OO并且想要处理属性,方法修饰符和延迟资源加载之类的东西而没有样板,那么值得投资学习Moose。为了说明,这是使用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 };
}

这些可能会有所帮助: