<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>backseat/helpers/wait_helper.rb</filename>
    </added>
    <added>
      <filename>backseat/helpers/xpath_helper.rb</filename>
    </added>
    <added>
      <filename>backseat/spec/matchers/appear.rb</filename>
    </added>
    <added>
      <filename>backseat/wrappers/abstract_wrapper.rb</filename>
    </added>
    <added>
      <filename>examples/rspec_example.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,7 @@
 Backseat is a proof of concept that uses Rjb to directly interact with the WebDriver Java classes. I'm still thinking about the API, so no specs just yet.
 
 EXAMPLES:
-    Please see firefox_example.rb and htmlunit_example.rb for implementations of the 2 official WebDriver examples from http://code.google.com/p/webdriver/wiki/GettingStarted.
+    Please see firefox_example.rb and htmlunit_example.rb in the examples directory for implementations of the 2 official WebDriver examples from http://code.google.com/p/webdriver/wiki/GettingStarted.
 
 REQUIREMENTS:
     a working JVM- you may need to set your LD_LIBRARY_PATH http://rjb.rubyforge.org/</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,18 @@
 require 'rubygems'
 require 'rjb'
 
-require File.expand_path(File.dirname(__FILE__) + '/backseat/element_wrapper')
-require File.expand_path(File.dirname(__FILE__) + '/backseat/driver')
-require File.expand_path(File.dirname(__FILE__) + '/backseat/xpath_helpers')
+require 'backseat/wrappers/abstract_wrapper'
+require 'backseat/wrappers/element_wrapper'
+require 'backseat/wrappers/driver_wrapper'
+require 'backseat/helpers/xpath_helper'
+require 'backseat/helpers/wait_helper'
 
 module Backseat
 
   class WaitTimeoutError &lt; StandardError; end
 
-  include XpathHelpers
+  include Helpers::XpathHelper
+  include Helpers::WaitHelper
 
   module Bridged
     (class &lt;&lt; self; self; end).class_eval do
@@ -47,19 +50,6 @@ module Backseat
     end
   end
   
-  
-  # Expects to be passed a proc that will a boolean as :until
-  def wait(options={})
-    proc = options[:until] || lambda { true }
-    max = options[:max] || 10
-    elapsed = 0
-    while !proc.call do
-      sleep 1
-      elapsed += 1
-      if elapsed == max
-        raise WaitTimeoutError, &quot;waited #{max} seconds to no avail&quot;
-      end
-    end
-  end
+  Driver = Backseat::Wrappers::DriverWrapper
   
 end
\ No newline at end of file</diff>
      <filename>backseat.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,18 +1,20 @@
 module Backseat
-  class Driver &lt; AbstractWrapper
+  module Wrappers
+    class DriverWrapper &lt; AbstractWrapper
     
-    def initialize(driver=:htmlunit)
-      @driver = case driver
-      when :firefox: Bridged.firefox.new
-      when :safari:  Bridged.safari.new
-      else Bridged.htmlunit.new
+      def initialize(driver=:htmlunit)
+        @driver = case driver
+        when :firefox: Bridged.firefox.new
+        when :safari:  Bridged.safari.new
+        else Bridged.htmlunit.new
+        end
+        @element = @driver
       end
-      @element = @driver
-    end
     
-    def_chainable_delegator :@element, :get
-    def_delegator :@element, :getTitle, :get_title
-    def_delegators :@element, :close
+      def_chainable_delegator :@element, :get
+      def_delegator :@element, :getTitle, :get_title
+      def_delegators :@element, :close
     
+    end
   end
 end
\ No newline at end of file</diff>
      <filename>backseat/wrappers/driver_wrapper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,81 +1,22 @@
-require 'forwardable'
-
 module Backseat
-  class AbstractWrapper
-
-    class_eval do
-      def self.def_chainable_delegator(instance_var, method, new_name=nil)
-        new_name ||= method
-        class_eval &lt;&lt;-STR
-          def #{new_name}(*args)
-            instance_variable_get(:#{instance_var}).send(:#{method}, *args)
-            self
-          end
-        STR
-      end
-    end
-    
-    extend Forwardable
-    
-    attr :driver
-    attr :element
-    
-    def initialize(driver, element)
-      @driver = driver
-      @element = element
-    end
-
-    def contains?(query)
-        query = by.xpath(query) if query.is_a? XpathLocator
-        @element.findElements(query).toArray.size &gt; 0
-    end
+  module Wrappers
+    class ElementWrapper &lt; AbstractWrapper
     
-    def find_element(query)
-      query = by.xpath(query) if query.is_a? XpathLocator
-      ElementWrapper.new(@driver, @element.findElement(query))
-    end
-    
-    def find_elements(query)
-      query = by.xpath(query) if query.is_a? XpathLocator
-      @element.findElements(query).toArray.map do |element|
-        ElementWrapper.new(@driver, element)
+      def attribute(name)
+        @element.getAttribute(name.to_s)
       end
-    end
     
-    def send_keys(*args)
-      @element.sendKeys(args)
-      self
-    end
-    
-    def to_html
-      # TODO
-    end
-    
-    def [](arg)
-      return attribute(arg) if arg.is_a? Symbol
-      find_element(arg)
-    end
+      def_chainable_delegator :@element, :clear
+      def_chainable_delegator :@element, :click
+      def_chainable_delegator :@element, :submit
+      def_chainable_delegator :@element, :toggle
+      def_chainable_delegator :@element, :setSelected, :select
     
-    alias :/ :find_elements
-    
-  end
-  
-  class ElementWrapper &lt; AbstractWrapper
-    
-    def attribute(name)
-      @element.getAttribute(name.to_s)
+      def_delegator :@element, :getText, :text
+      def_delegator :@element, :getValue, :value
+      def_delegator :@element, :isSelected, :selected?
+      def_delegator :@element, :isEnabled, :enabled?
+      def_delegator :@element, :isDisplayed, :displayed?
     end
-    
-    def_chainable_delegator :@element, :clear
-    def_chainable_delegator :@element, :click
-    def_chainable_delegator :@element, :submit
-    def_chainable_delegator :@element, :toggle
-    def_chainable_delegator :@element, :setSelected, :select
-    
-    def_delegator :@element, :getText, :text
-    def_delegator :@element, :getValue, :value
-    def_delegator :@element, :isSelected, :selected?
-    def_delegator :@element, :isEnabled, :enabled?
-    def_delegator :@element, :isDisplayed, :displayed?
   end
 end
\ No newline at end of file</diff>
      <filename>backseat/wrappers/element_wrapper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,18 +3,22 @@ include Backseat
 
 Backseat.load!('/Users/jimb/src/webdriver/trunk')
 
-driver = Backseat::Driver.new(:firefox)
+def wait_until_visible(element)
+  wait :until =&gt; lambda { @driver.has_child?(element) &amp;&amp;
+                          @driver.find_element(element).displayed? }
+end
+
+@driver = Backseat::Driver.new(:firefox)
 
-driver.get('http://www.google.com/webhp?complete=1&amp;hl=en')
+@driver.get('http://www.google.com/webhp?complete=1&amp;hl=en')
 
-element = driver.find_element input(:name =&gt; 'q')
+element = @driver.find_element input(:name =&gt; 'q')
 element.send_keys('Cheese')
 
-wait :until =&gt; lambda { driver.contains?(table(:class =&gt; 'gac_m')) &amp;&amp;
-                        driver.find_element(table(:class =&gt; 'gac_m')).displayed? }
+wait_until_visible table(:class =&gt; 'gac_m')
 
-driver.find_elements(td(:class=&gt; 'gac_c')).each do |e|
+@driver.find_elements(td(:class=&gt; 'gac_c')).each do |e|
   puts e.text
 end
 
-driver.close # quit Firefox
\ No newline at end of file
+@driver.close # quit Firefox
\ No newline at end of file</diff>
      <filename>examples/firefox_example.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>backseat/helpers/xpath_helpers.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>68abaa992742dae151d90247e798c803367ecc69</id>
    </parent>
  </parents>
  <author>
    <name>Jim Benton</name>
    <email>jim@autonomousmachine.com</email>
  </author>
  <url>http://github.com/jim/backseat/commit/9576f46f50c81a160d8332d574fe14103d6e08ef</url>
  <id>9576f46f50c81a160d8332d574fe14103d6e08ef</id>
  <committed-date>2008-10-18T16:17:31-07:00</committed-date>
  <authored-date>2008-10-18T16:17:31-07:00</authored-date>
  <message>Finished reorganization, and started thinking about rspec integration</message>
  <tree>7e76eaa65cc3e7e621d9c7d1308c7f1f70fc2b9e</tree>
  <committer>
    <name>Jim Benton</name>
    <email>jim@autonomousmachine.com</email>
  </committer>
</commit>
