method_missing

上からたどらないでも良いようにしてみた。

class Phi::Form
	def method_missing (name, *args)
		if @all_controls and result = @all_controls[name]
			result
		else
			update_all_controls
			@all_controls[name] or super
		end
	end

	def update_all_controls
		@all_controls = Hash.new
		find = proc do
			|c|
			return unless c.respond_to?(:controls)
			c.controls.each do
				|control|
				@all_controls[control.name.to_sym] = control
				find[control]
			end
		end
		find[self]
	end
end

Delphiで作る限り同一フォーム内で名前が被ることはない。
ので、これで良いということにする。
 
method_missing を使わずに、はじめに全コントロールのメソッドを定義しようかと思ったけれど、動的にコントロールを追加する可能性があるのでやめた。
ただ、これもコントロールを削除した場合に困る。