def get(val,clean_rescue=true)
args = parser.args
@values ||= {}
@object ||= nil
clean_rescue = !args['raise_on_error'] if clean_rescue
val.gsub!(/[#{Regexp.escape(parser.method_separators)}]/,'.')
key, rest = val.split(/\./, 2)
value = case
when @values.has_key?(key)
@values[key]
when @values.has_key?(key.to_sym)
@values[key.to_sym]
when !@object
if @parent
@parent.get(val)
else
nil
end
when @object.respond_to?(:has_key?)
if @object.has_key?(key)
@values[key] = @object[key]
else
return @parent.get(val) if @parent
nil
end
when @object.respond_to?(sym = key.to_sym)
@values[key] = @object.send(sym)
when key == '__ITEM__'
@object
when @parent
return @parent.get(val)
else
nil
end
if rest
names = [key]
rest.split(/\./).each do |i|
names << i
name = names.join('.')
begin
value = if @values.has_key?(name)
@values[name]
else
@values[name] = value = case
when @values.has_key?(name)
@values[name]
when value.respond_to?(:has_key?)
value[i]
when value.respond_to?(:[]) && i =~ /^\d+$/
value[i.to_i]
when value.respond_to?(i)
value.send(i)
else
nil
end
end
rescue NoMethodError => er
return nil
end
end
end
value
rescue Exception => e
if clean_rescue
"[ Error: #{e.message} ]"
else
raise e
end
end