In the past, in environments other than Rails, I''ve a couple of times gainfully used path expressions to refer to objects in the UI-layer. Now, in Rails, I''m already using them for creating lists where columns are described by meta data. I take it that there are even more an better uses. I haven''t thought this through carefully, so here are just one example. Currently, to get a text input field one writes something like this <%= text_field ''address'', ''street'' %> This requires the existence of a binding for ''address'' in the template. Now assume the address is reachable from another object, ''person'', anyway. Then how about writing it like this instead: <%= text_field ''person.address.street'' %> which is meant to result in this HTML <input type="text" id="person_address_street" name="person[address][street]" value="..." /> For iteration over multiple values a wildcard, ''*'', could be used in the path. For the moment I don''t quite see how to make this really useful, though. I think a fairly minimal language for expressing paths is sufficient in Rails as there''s always Ruby to fall back on. Full-grown navigational language such as XPath-applied-to-objects or OGNL (Java) are more appropriate for environments where the host language is not accessible. Below is my first stab at an extended Object#send method that handles paths. I''m interested in your thoughts. Michael class Object alias_method :send_without_path, :send def send(path, *args) if path.kind_of?(Symbol) return self.send_without_path(path, *args) elsif path.kind_of?(Array) path = path.dup elsif path.kind_of?(String) path = path.split(''.'') else raise TypeError, "Unrecognized path type for send: <#{path}>" end method = path.shift case when method == ''*'' raise TypeError, "Wildcard path item is only applicable to Enumerables; self: <#{self}>" unless self.kind_of?(Enumerable) if !path.empty? next_value = self.inject([]) { |result, elem| result << elem.send(path, *args) } else next_value = self end return next_value when self.respond_to?(method) next_value = self.send_without_path(method, *args) when self.respond_to?(''[]'') next_value = self.send_without_path(''[]'', method, *args) else raise TypeError, "Can''t advance path to ''#{method}''; no applicable method for <#{self.inspect}>" end if not path.empty? next_value.send(path, *args) else next_value end end end -- Michael Schuerig Failures to use one''s frontal lobes mailto:michael-q5aiKMLteq4b1SvskN2V4Q@public.gmane.org can result in the loss of them. http://www.schuerig.de/michael/ --William H. Calvin