def deferred(name, &impl)
impl_name = Container.impl_method_name(name)
define_method(impl_name, &impl)
proxy_name = Container.impl_method_name("#{name}_proxy")
ivname = Container.iv(name)
proxy_ivname = Container.iv("#{name}_proxy")
define_method(name) do
instance_variable_get(ivname) || send(proxy_name)
end
define_method(proxy_name) do
proxy = instance_variable_get(proxy_ivname)
unless proxy
proxy = proc {instance_variable_set(ivname, send(impl_name))}
def proxy.method_missing(*args, &block)
call.__send__(*args, &block)
end
instance_variable_set(proxy_ivname, proxy)
class << proxy; self; end.class_eval do
(proxy.methods - PROXY_METHODS).each do |m|
undef_method m
end
end
end
proxy
end
end