OOP(1) 祝福あれ!(bless)

Perl でのオブジェクト指向プログラミング(OOP)を勉強します。といっても、Perl には(JavaC++のように)オブジェクト指向用のキーワードなどは存在せず、全てがPerlの通常の言語仕様の範囲でまかなわれているとの事。面白そうです。
C言語などの手続き指向が手続き・関数を中心に考えるのに対し、オブジェクト指向はモノを中心に考える、というプログラミング技術ですね。カプセル化(隠蔽)、ポリモーフィズム多態性)、インヘリタンス(継承)など色々な概念をまとめたものです。(長くなってしまうので、ここでは詳しく説明できません)
Perl のパッケージについては以前勉強しましたが、このパッケージが実は1つのクラスになるそうです。
パッケージにコンストラクタ(オブジェクトを生成する為の関数)やメソッド(オブジェクトの操作)を書く事で、オブジェクトとして振舞うようになるわけですね。
コンストラクタもメソッドもその正体はただのサブルーチン(関数)のようなのに、なぜオブジェクトとして振舞うのか。コンストラクタに秘密があるようです。
以下が、簡単なクラスのコードです。

package Animal;
sub new { bless {}; }

関数 new が、Animal クラスのコンストラクタとなります。*1
この関数 new は bless 関数を無名ハッシュへのリファレンスを渡して呼び出して、その返り値をそのまま返しているわけですが、この bless が魔法のタネのようですね。以下に「perldoc -f bless」の一部を引用します。

bless REF,CLASSNAME
bless REF
        This function tells the thingy referenced by REF that it is now
        an object in the CLASSNAME package. If CLASSNAME is omitted, the
        current package is used. Because a "bless" is often the last
        thing in a constructor, it returns the reference for
        convenience. Always use the two-argument version if a derived
        class might inherit the function doing the blessing. See
        perltoot and perlobj for more about the blessing (and blessings)
        of objects.

「この関数はリファレンスREFが参照しているモノに“お前はCLASSNAMEパッケージのオブジェクトだ”と教えます。」……ん? (^_^;) 訳し方が悪いのかよくわかりませんね。
つまり、bless 関数にリファレンスREFとパッケージ名CLASSNAMEを渡すと、そのリファレンスREFをCLASSNAMEのオブジェクトであるように振舞わせる関数、という事でしょうか。CLASSNAMEが省略されると現在のパッケージが使われます。
bless 関数はよくコンストラクタの最後に書かれるので、便利さのために渡されたリファレンスをそのまま返すようです。(そのままコンストラクタの返り値としてリファレンスを返せる為)
上のコードでは無名ハッシュのリファレンスを渡しましたが、リファレンスなら何でもいいそうです。
そして、今後、返したリファレンスを通じてメソッドが呼び出された時、第一引数にそのリファレンスが渡されます。オブジェクト内部の状態はこのリファレンスが参照しているモノ(無名ハッシュなど)に入出力しておけば、そのオブジェクトのインスタンスメソッドとして振舞えるわけですね。
オブジェクト自身が this などの特別なキーワードではなく、引数として渡されるのは Python などでも同じですので、感覚としてはわかります。
ちなみに、クラスメソッド(static)の場合、第一引数はもちろんオブジェクトではなくクラス(パッケージ)の名前が入っているとの事。
「bless」は和訳すると「祝福する、命を授ける」などの意味があります。リファレンスに命を吹き込むとオブジェクトになるわけですね。Perl作者の Larry Wall さんはクリスチャンなのでしょうか。(^_^)

*1:名前が new となっているのは C++ プログラマなどの習慣で、本当は何でもいいらしいです