This is an old revision of the document!


概要

POPFile は、Perl の OO (Object Oriented : オブジェクト指向)機能を使ったモジュールの集まりから構成されています。 これらのモジュールは以下の3種類に分けられます。

  1. “POPFile Loadable Module (POPFile がロード可能なモジュール)” (PLM) は # POPFILE LOADABLE MODULE で始まる標準的な Perl モジュールで、POPFile のモジュールの一つである POPFile::Loader によって動的にロードされます。すべての PLM は POPFile::Module のサブクラス (または、サブ・サブクラス)であり、 POPFile::Module には (クラスについての) 大量の文書が含まれています。
  2. PLM ではないが PLM の親クラスになるモジュール。たとえば、Proxy::Proxy, POPFile::Module, UI::HTTP など。
  3. 上の二つ以外で、POPFile のどこかでロードされるモジュール。たとえば POPFile::Loader, Classifier::MailParse, Classifier::WordMangle など。

プライベート、プロテクテッド、パブリック (Private, Protected and Public)

Perl はメソッドやメンバー変数へのアクセスを管理する機構を持っていないので、POPFile はプライベート、プロテクテッド、パブリックを区別するためにメソッド名やメンバー変数名のつけかたに便宜的なルールを使います。

  1. プライベートなメソッドや変数は、クラス外からのアクセス/呼び出しをしてはいけないことを示すため、名前の後ろに __ (2つのアンダースコア)を付加します。
  2. プロテクトされているメソッドや変数は、サブクラス以外にはクラス外からのアクセス/呼び出しをしてはいけないことを示すため、名前の後ろに _ (1つのアンダースコア)を付加します。
  3. パブリックなメソッドや変数には、何も付加しません。

オブジェクトの関係

主なオブジェクトは下記のような関係にあります:

                                                   POPFile::Module
                                                          ^
                                                          |            
                                                          |
           +---------------------------------+------------+-----------+------------+-----------------+----------------------+--------------+
           |                                 |                        |            |                 |                      |              |
           |                                 |                        |            |                 |                      |              |
    Classifier::Bayes                  Proxy::Proxy                UI::HTTP   UI::XMLRPC   POPFile::Configuration   POPFile::Logger   POPFile::MQ
    (has a Classifier::MailParse             ^                        ^
     and a Classifier::WordMangle)           |                        | 
                                             |                        |
                               +-------------+-----------+            |
                               |             |           |            |
                          Proxy::POP3  Proxy::SMTP  Proxy:NNTP     UI::HTML

POPFile::Module

このモジュールはすべての POPFile Loadable Modules の基礎となるクラスを実装しており、すべての POPFile モジュールに共通のメソッドを含みます。特定のものだけが、サブクラスによってオーバーライドされる必要があります。 すべてのパプリック関数は正常に POPFile が動いている間に POPFile::Loader によって呼ばれます。

  1. initialize() - クラスが生成されたあとで、内部変数とグローバルな環境設定にデフォルト値をセットするために呼ばれます。
  2. start() - すべての環境設定が読み込まれて、POPFile が動作可能となったときに一度だけ呼ばれます。
  3. stop() - POPFile がシャットダウンするときに呼ばれます。
  4. service() - POPFile の主プロセスから、サブモジュールにそれ自身の作業をさせるために呼ばれます。(なにもサービスをする必要がないモジュールに対しては任意です)
  5. prefork() - モジュールが fork を要求した時に呼ばれますが、これは fork 発生の前に呼ばれます。
  6. forked() - モジュールがプロセスを fork したときに呼ばれます。これは子プロセスの中でよばれ、クリーンナップのために使われるべきです。
  7. postfork() - 親プロセスの中で、fork が発行されたことを知らせるために呼ばれます。forked() に似ていますが、こちらは親プロセス用です。
  8. reaper() - プロセスが終了するときに、モジュールに必要ならクリーンナップをする機会を与えるために呼ばれます。
  9. name() - 他のモジュールが %components ハッシュを通じてアクセスすることのできるモジュールの名前を返します。返された名前は %components でこのモジュールを表すキーとなります。
  10. deliver() - メッセージを配達するために、メッセージキューから呼ばれます。

次のメソッドはプロテクトされており、サブクラスからのみアクセスするようにしてください。

  1. log_() - 文字列を logger に送ります。
  2. config_() - このモジュールの設定パラメータを得る、または設定します。
  3. mq_post_() - メッセージキューへメッセージを送信します。
  4. mq_register_() - メッセージキューから (受け取りたい) メッセージタイプを登録します。
  5. register_configuration_item_() - (設定変更のための) UI が必要な環境設定を登録します。

パラメータ設定のためのモジュール・アクセス

PLM によっては POPFile セッション間の情報を保持したり、パラメータを変更可能にしたりしたい場合があるでしょう。 POPFile は POPFile::Configuration モジュールによって管理される、パラメータを保持するための汎用的な機構を持っています。

どの PLM もそれ自身のパラメータを config_ メソッドを通じて登録したりアクセスしたりすることができます。<br> 単一のパラメータを指定して config_ を呼べば(たとえば $self→config_( 'my_param' ))、そのパラメータの設定値を得ることができます。 これは PLM の initialize() 関数が一度呼ばれたあとならば、実行することができます。<br> 2つのパラメータをつけて config_ を呼べば、そのパラメータの値を設定することができ、POPFile::Configuration モジュールにパラメータ・テーブルが変更されていてディスクに保存する必要があることを知らせます。

パラメータに初期値を設定するために、PLM は それ自身の initialize メソッドの中で config_ を呼びます。 すべての PLM が initialize() を呼んだあとで、POPFile は現行のパラメータをディスクから読み、こうして初期値もディスクに保存されていた値も考慮されるようになります。

複数のモジュール間でパラメータ名の衝突が起きる心配はありません。それぞれのパラメータは、保持されたりアクセスされたする前に個別の名前空間に配置されているからです。 これは、現在のところ、PLM が name を使って設定する名前によって決定されます。 PLM の名前を、何かが config_ を呼ぶ前にセットしておくことが必須です。これは通常は PLM の new メソッドによって実行されます。 現在のところ、名前はパラメータ名の前に _ をはさんで追加されます。 こうして、foobar という名前を持つモジュールはそれぞれが param という異なったパラメータを定義できますが、これらはディスクに保存される前に foo_parambar_param に変換されます。 この (モジュール名とパラメータ名を _ をはさんでつなぐという) ルールはいつ変更されるかわからないので、PLM はこの命名法を前提としてはならず、config_ 経由でのみパラメータにアクセスするようにしてください。

PLM が、他のモジュールのパラメータを読み取る必要があることもあります。 これはモジュール名(その name を呼ぶことで設定された名前)をつけて module_config_ を呼ぶことで、実行できます。 たとえば、ある PLM は $self→module_config_( 'foo', 'param' ) を呼ぶことで、foo モジュールの param パラメータにアクセスできます。 (しかしながら、できる限り) この機能を使うことは控えるべきでしょう。

なお、グローバル・パラメータにアクセスするには global_config_ を使います。

モジュール間のコミュニケーション

POPFile::MQ は、POPFile::Module のすべてのサブクラスが他のモジュールにメッセージを送るためにアクセスする汎用的なメッセージ・キューイング・システムです。 どのモジュールも、メッセージ・タイプ別に登録された他のモジュールへ非同期のメッセージ送信ができます。

モジュールは mq_register_ で特定のメッセージ・タイプ (そのタイプのメッセージを受け取るために) に登録します。 モジュールは、パブリック関数 deliver を実装しなければなりません。このモジュールを通してメッセージが配達されることになります。 モジュールは mq_post_ によってメッセージを送信します。 現時点では、メッセージは自由様式であり、メッセージ・タイプについての明確な決まりはありません。 もし、新しいメッセージ (タイプ) が追加される場合には、POPFile::MQ の先頭部分に (追加したメッセージタイプについての) 説明文書を追加してください。

現時点でのメッセージは以下のとおりです:

メッセージ ID 説明 送信元 受信者
CLASS メールが分類されたことの通知。メッセージはバケツであり、パラメータは null。 Proxy::Proxy UI::HTML
UIREG UI コンポーネントの登録。メッセージはコンポーネント・タイプであり、パラメータは UI 上の要素と登録しようとしているオブジェクトへのリファレンス。 Proxy::POP3, Proxy::SMTP, Proxy::NNTP, UI::XMLRPC UI::HTML
TICKD 最終の TICKD から1時間経過したとき発生。 POPFile::Logger UI::HTML, POPFile::Logger
LOGIN プロキシがリモート・サーバーへログインしたとき発生。メッセージは (リモート・サーバーに) 送られたユーザー名。 Proxy::Proxy UI::HTML
NEWFL 新しいファイルがディスク上の履歴キャッシュへ書かれたときに発生。メッセージはファイル名。 Proxy::Proxy UI::HTML

UIREG は、POPFile::Module の register_configuration_item_ を呼ぶことで、送られます。

下図が、どのメッセージを誰が送って誰が受信するのかを理解する助けになるでしょう。

              UI::HTML
               ^  ^  ^
               |  |  |
               |  |  +------------------------+
               |  |                           |
       +-------+  +----------+                |
       |                     |                |
       | +------+          NEWFL              |
       | |      |          LOGIN              |
      TICKD     |          CLASS            UIREG
        |       |            |                |
POPFile::Logger |      Proxy::Proxy       Proxy::POP3
       ^        |      (via pipe from     Proxy::NNTP
       |        |       POP3/SMTP/NNTP)   Proxy::SMTP
       +--------+                         UI::XMLRPC

原文

開発者向けコーナー

POPFile ドキュメンテーションプロジェクト

 
jp/objectmodel.1169646152.txt.gz · Last modified: 2008/02/08 19:49 (external edit)

Should you find anything in the documentation that is incomplete, unclear, outdated or just plain wrong, please let us know and leave a note in the Documentation Forum.

Recent changes RSS feed Donate Driven by DokuWiki
The content of this wiki is protected by the GNU Fee Documentation License