Class-Data-Inheritable-0.02 > Class::Data::Inheritable

名前

Class::Data::Inheritable - 継承可能な, オーバーライド可能な、クラスデータ

概要

  package Stuff;
  use base qw(Class::Data::Inheritable);

  # DataFileを、継承可能なクラスデータとしてセットアップする。
  Stuff->mk_classdata('DataFile');

  # このクラスためにデータファイルの場所を宣言する。
  Stuff->DataFile('/etc/stuff/data');
  

概要

Class::Data::Inheritable は、クラスデータのアクセサ/ミューテータを作るのに向いています。 つまり、(単一のオブジェクトとは違って、)クラス全体に何かを蓄えたい場合です。 このデータは、サブクラスで継承され得ますし、オーバーライドされ得ます。

例:

  Pere::Ubu->mk_classdata('Suitcase');

これは、Suitcate メソッドを、Pere::Ubu クラスに生成します。

新しいメソッドは、クラスデータの一つを得たり、セットするのに、使われ得ます。

  Pere::Ubu->Suitcase('Red');
  $suitcase = Pere::Ubu->Suitcase;

面白い部分が、クラスが Pere::Ubu から継承するときに起こります:

  package Raygun;
  use base qw(Pere::Ubu);
  
  # Raygunのスーツケースは Red.
  $suitcase = Raygun->Suitcase;

Raygun は、Pere::Ubuからスーツケースクラスデータ継承します。

クラスデータの継承は、メソッド継承にanalgousを動かします。 Raygunが、継承されたクラスデータを(Suitcase()を使って、新しい値をセットすることによって)"オーバーライド"しないかぎり、 Pere::Ubu で、セットされたものをなんでも使い続け、以前の変更を継承し続けます。

  # Raygun と Pere::Ubu の suitcases は、今は Blue です。
  Pere::Ubu->Suitcase('Blue');

しかし、Raygun が、自分自身のSuitcase() をセットするべきだと決めると、 Suitcase() は、 今や、Pare::Ubu を"オーバーライド"しており、Raygun 自身のものです。 オーバーライドされたメソッドにちょうど、似ています。

  # Raygun は orange のスーツケースを持つが、Pere::Ubu のスーツケースは、まだ Blue です.
  Raygun->Suitcase('Orange');

さて、Raygun は、Pare::Ubu をオーバーライドしたので、Pare::Ubu による、以前の変更は まったく Raygun には、影響を与えません。

  # Raygun は、まだ、orange のスーツケースですが、 Pere::Ubu は、Samsonite を使います。
  Pere::Ubu->Suitcase('Samsonite');

メソッド

mk_classdata
  Class->mk_classdata($data_accessor_name);

これはクラスメソッドで、新しいクラスデータのアクセサを宣言するのに使われます。 $data_accessor_name を名前に使って、新しいアクセサがクラス内に作られます。

オーバーライドを容易にするために、mk_classdata は、アクセサへのエイリアス _field_accessor() を作ります。 それで、Suitcase() には、_Suitcase_accessor() というエイリアスがあり、 このエイリアスは、Suitcase() と、ちょうど同じことをします。 単一のアクセサの振る舞いを変えようとして、 まだ、継承可能なクラスデータの恩恵を得たいなら、有益です。次の例のように。

  sub Suitcase {
      my($self) = shift;
      warn "Fashion tragedy" if @_ and $_[0] eq 'Plaid';

      $self->_Suitcase_accessor(@_);
  }

原文まま

Copyright (c) 2000, Damian Conway and Michael G Schwern. All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the terms of the Perl Artistic License (see http://www.perl.com/perl/misc/Artistic.html)

原文まま

Original code by Damian Conway.

Maintained by Michael G Schwern <schwern@pobox.com>

SEE ALSO

perltootc は、とても入念なPerlのクラスデータについての議論があります。

翻訳について

翻訳者:加藤敦 (ktat.is@gmail.com)

Perlドキュメント日本語訳 Project にて、 Perlモジュール、ドキュメントの翻訳を行っております。

 http://sourceforge.jp/projects/perldocjp/
 http://www.freeml.com/ctrl/html/MLInfoForm/perldocjp@freeml.com
 http://www.perldoc.jp