<?xml version="1.0" encoding="UTF-8" ?>
<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom">
	<generator uri="http://nucleuscms.org/" version="Nucleus CMS v3.31SP1-kes">Nucleus CMS v3.31SP1-kes</generator>

	<id>http://fireball.loafer.jp/kes/</id>
	<link rel="self" type="application/atom+xml" href="http://fireball.loafer.jp/kes/atom.xml" />
	<link rel="related" type="text/html" href="http://fireball.loafer.jp/" />
	<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/" />

	<rights>© 2008 Project Loafer/Project Fireball and all blog writers.</rights>

	<title>Entering Passive Mode</title>
	<subtitle>やる気のない受け身なブログ。実験場。</subtitle>

	<updated>2006-05-02T21:57:00+09:00</updated>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
さて、今日で完成としよう。
</p>
<p>
必要な機能は、引数無しで指定した場合、<br />
自動的にシンボルテーブルのメソッドを調べることだ。
</p>
<p>
ただ、モジュールが use された直後ではまずい。<br />
use は、暗黙的に BEGIN ブロックで実行されるため、<br />
定義されているメソッドが読み込まれる前に実行される。
</p>
<p>
そのため import 内で対象のシンボルテーブルを検索しても、<br />
シンボルテーブルにはまだメソッドが定義されていない。<br />
対策として、import ではパッケージ名だけ記憶しておき、<br />
シンボルテーブルの検索は後で行えばよい。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_141.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_141.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_141.html" />
		<published>2006-05-02T21:57:00+09:00</published>
		<title type="html"><![CDATA[取りあえず完成]]></title>
		<updated>2006-05-02T21:57:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
では、シンボルテーブルからコードを検索してみよう。<br />
例えば、Carp のシンボルテーブルを調べてみる。
</p>
<p>
&nbsp; &nbsp; use Carp;
</p>
<p>
まずはシンボルテーブルを取得する。
</p>
<p>
&nbsp; &nbsp; my $package = 'Carp';<br />
&nbsp; &nbsp; no strict 'refs';<br />
&nbsp; &nbsp; my $symbol_table = \%{&quot;${package}::&quot;};<br />
&nbsp; &nbsp; use strict 'refs';
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_140.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_140.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_140.html" />
		<published>2006-05-01T23:11:00+09:00</published>
		<title type="html"><![CDATA[シンボルの列挙]]></title>
		<updated>2006-05-01T23:11:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
最後に、新しくモジュールを起こす場合に<br />
便利と思われる機能を考えてみよう。
</p>
<p>
現行の property モジュールの仕様であれば、<br />
setter/getter の多いモジュールの場合、<br />
それらをプロパティ化するために、<br />
いくつも指定しなければならない。
</p>
<p>
use property 'name';<br />
use property 'gender';<br />
use property 'weight';<br />
use property 'salary';
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_139.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_139.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_139.html" />
		<published>2006-04-30T23:15:00+09:00</published>
		<title type="html"><![CDATA[メソッドの存在確認]]></title>
		<updated>2006-04-30T23:15:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
ここまで幾つかの考察をしてきた。<br />
property モジュール全体を書き直してみよう。
</p>
<p>
プロパティ名、転送先 getter/setter メソッド名は、<br />
継承上の問題により、共に文字列で指定し、<br />
動的に処理する方が相応しいことが判明した。
</p>
<p>
property モジュールの引数はハッシュリファレンスだが、<br />
そのパラメータは全て文字列で渡されることになる。<br />
例えばプロパティが、'salary' の場合、<br />
getter/setter は、'set_salary', 'get_salary' となる。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_138.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_138.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_138.html" />
		<published>2006-04-29T22:56:00+09:00</published>
		<title type="html"><![CDATA[ここまでの整理]]></title>
		<updated>2006-04-29T22:56:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
Java や C# では、Object というルートクラスがある。<br />
あらゆるクラスは暗黙的に Object から派生している。<br />
Perl にも同様、暗黙的ルートとなるクラスがある。<br />
それは、UNIVERSAL クラスと呼ばれる。
</p>
<p>
UNIVERSAL は Perl が特殊扱いするクラスであり、<br />
@ISA を明示しなくても継承されているとみなされる。
</p>
<p>
UNIVERSAL には、isa, can と呼ばれる関数がある。<br />
これらはオブジェクトの実装を確認するために使用できる。<br />
isa, can はメソッドとしても機能し、<br />
あらゆるオブジェクトにはこれらが継承されている。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_137.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_137.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_137.html" />
		<published>2006-04-28T23:58:00+09:00</published>
		<title type="html"><![CDATA[UNIVERSAL クラス]]></title>
		<updated>2006-04-28T23:58:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
さて、今までは読み書き両用でみてきたが、<br />
現実には、読み取り専用のプロパティや、<br />
書き込み専用のプロパティもある。
</p>
<p>
property のインタフェースは、<br />
プロパティ名、getter、setter の名前を渡すことだが、<br />
読み取り専用や書き込み専用の場合どうするか。
</p>
<p>
1. getter、setter として、undef を渡せるようにする。
</p>
<p>
getter が undef の場合、読み取りはできない、<br />
setter が undef の場合、書き込みはできない。<br />
そのように実装することは可能だ。<br />
property 側は undef かメソッド名か調べ、<br />
undef であれば、croak すればいいというわけだ。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_136.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_136.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_136.html" />
		<published>2006-04-27T19:43:00+09:00</published>
		<title type="html"><![CDATA[読み取り・書き込み専用]]></title>
		<updated>2006-04-27T19:43:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
property.pm を動的呼び出しに対応させるには、<br />
インタフェースを変更しなければならない。
</p>
<p>
従来はコードリファレンスを受け取っていたが、<br />
新しい考え方では、メソッド名を渡すことになる。
</p>
<p>
幸い、リリース段階でないので、<br />
今後のことを考えてインタフェースを変更しよう。
</p>
<p>
引数をハッシュで渡すのは効率が悪いので、<br />
ハッシュリファレンスを使うことにする。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_135.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_135.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_135.html" />
		<published>2006-04-26T19:57:00+09:00</published>
		<title type="html"><![CDATA[継承に対応させる]]></title>
		<updated>2006-04-26T19:57:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
昨日の考察により、コードリファレンスを使って、<br />
オブジェクトのメソッドを呼ぶことは、<br />
継承上の問題を生ずるため使えないことが判明した。
</p>
<p>
では、メソッドを動的に呼び出すにはどうすれば良いか。<br />
Perl には、メソッドへのリファレンスは存在しないため、<br />
事前に分かっていないメソッドを引き渡すには、<br />
文字列によるメソッド名の指定しかない。
</p>
<p>
では名前を使ってメソッドを呼ぶにはどうすればいいか。<br />
Perl はこれまた意外な答えを持っている。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_134.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_134.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_134.html" />
		<published>2006-04-25T19:27:00+09:00</published>
		<title type="html"><![CDATA[メソッドの動的呼び出し]]></title>
		<updated>2006-04-25T19:27:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
property モジュールはコードリファレンスを使って、<br />
該当パッケージのメソッドを関数のように呼び出す。<br />
これは、継承の問題と関連し、以下の問題を生じる。
</p>
<p>
1. 継承したメソッドをプロパティ化できない
</p>
<p>
あるクラスを継承したクラスを作る場合、<br />
祖先クラスに get_XXX/set_XXX のメソッドがあると、<br />
継承したクラスはそれらを利用できる。
</p>
<p>
しかし、それらをオーバーライドしない限り、<br />
メソッドの実体は祖先クラスにあり、<br />
継承クラスにはメソッドの定義自体が存在しない。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_133.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_133.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_133.html" />
		<published>2006-04-24T21:28:00+09:00</published>
		<title type="html"><![CDATA[継承とコードリファレンス]]></title>
		<updated>2006-04-24T21:28:00+09:00</updated>
	</entry>
	<entry>
		<author>
			<name>kes</name>
			<uri>http://loafer.jp</uri>
		</author>
		<category term="Perl" scheme="http://fireball.loafer.jp/kes/perl/" />
		<content type="html">
<![CDATA[
<p>
そこそこ洗練されてきた property モジュールだが、<br />
まだまだ課題点はある。
</p>
<p>
問題の一つは、登録時に setter/getter の<br />
コードリファレンスを指定していることだ。
</p>
<p>
Perl におけるコードリファレンスは、<br />
関数を指すリファレンスであり、<br />
メソッドを指すリファレンスとはならない。
</p>
<p>
関数とメソッドに、構文上の違いはないが、<br />
メソッドのリファレンスを取ると、<br />
それはメソッドとしての意味を失い、<br />
ただの関数のリファレンスとして扱われる。
</p>
<a href="http://fireball.loafer.jp/kes/perl/article_132.html">続きを読む</a>
]]>
		</content>
		<id>http://fireball.loafer.jp/kes/perl/article_132.html</id>
		<link rel="alternate" type="text/html" href="http://fireball.loafer.jp/kes/perl/article_132.html" />
		<published>2006-04-23T23:50:00+09:00</published>
		<title type="html"><![CDATA[関数とメソッド]]></title>
		<updated>2006-04-23T23:50:00+09:00</updated>
	</entry>

</feed>
