175: def selector(symbol, *selector, &block)
176: raise ArgumentError, "Missing selector: the first argument tells us what to select" if selector.empty?
177: if selector[0].is_a?(String)
178: selector = HTML::Selector.new(*selector)
179: else
180: raise ArgumentError, "Selector must respond to select() method" unless selector.respond_to?(:select)
181: selector = selector[0]
182: end
183: if block
184: define_method symbol do |element|
185: selected = selector.select(element)
186: return block.call(selected) unless selected.empty?
187: end
188: define_method "first_#{symbol}" do |element|
189: selected = selector.select_first(element)
190: return block.call([selected]) if selected
191: end
192: else
193: define_method symbol do |element|
194: return selector.select(element)
195: end
196: define_method "first_#{symbol}" do |element|
197: return selector.select_first(element)
198: end
199: end
200: end