def take_value_for_keypath( keypath, value )
paths = keypath.split '.'
object = self
paths.each_with_index do |path, index|
writer = "#{path}="
if (index + 1) == paths.size then
if object.respond_to? :take_value then
object.take_value(path, value)
elsif object.respond_to? writer then
object.__send__(writer, value)
elsif directly? object then
object.instance_eval "@#{path}=value"
else
begin
handle_take_value(writer, value)
rescue UnknownKeyError
_raise_error(object, path)
end
end
else
if object.respond_to? :retrieve_value then
object = object.retrieve_value path
elsif object.respond_to? path then
object = object.__send__ path
elsif directly? object then
object = object.instance_eval "@#{path}"
else
begin
object = handle_retrieve_value path
rescue UnknownKeyError
_raise_error(object, path)
end
end
end
end
end