2

オブジェクトのメソッドへのすべての呼び出しで何らかの値 (この場合はトークンの年齢) をチェックしたいと思います。一度にすべてのメソッドに設定することはできますか? コンストラクタのように?私はそのような単純なコンストラクタを持っています:

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

すべてのメソッドに年齢チェックを含めることは避けたいので、より一般的な実装方法を探します。いくつかありますか?

4

3 に答える 3

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.
于 2012-08-10T15:23:05.643 に答える
1

Perl で OO を行っていて、ボイラープレートなしで属性、メソッド修飾子、遅延リソースの読み込みなどを処理したい場合は、Mooseの学習に投資する価値があると正直に思います。説明のために、これは Moose を使用して必要なものを記述する 1 つの方法です。

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 };
}

これらは役立つかもしれません:

于 2012-08-11T09:34:16.743 に答える
1

Class::Method::ModifiersまたはClass::Method::Modifiers::Fastモジュールを参照してください。

于 2012-08-10T21:12:33.967 に答える