<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,2 +1,4 @@
 pkg
 *.gem
+*.log
+*.db</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,5 @@
+require 'activerecord'
+
 module Schemer
   def schema(*args)
     extend  ClassMethods
@@ -8,27 +10,39 @@ module Schemer
   end
 
   module ClassMethods
+    # Columns which we don't touch regardless of not being defined in schema
+    # (and are ignored if they are defined in schema)
     def protected_columns
       %w( id )
     end
+
+    # Create the underlying table for this class
+    def create_table
+      ActiveRecord::Migration.create_table(table_name) do |t|;end;
+    end
+    
+    # Update ActiveRecord's automatically generated methods so we don't have to
+    # reload for schema changes to take effect
+    def update_methods
+      generated_methods.each { |method| remove_method(method) }
+      @columns = @column_names = @columns_hash = @generated_methods = nil
+    end
+    
+    # Update the underlying schema as defined by schema call
+    def update_schema
+      create_table unless table_exists?
+      (schema_columns - column_names).each { |column| ActiveRecord::Migration.add_column(table_name, column, :string) }
+      (column_names - protected_columns - schema_columns).each { |column| ActiveRecord::Migration.remove_column(table_name, column) }
+    end    
   end
   
   module InstanceMethods
     def initialize(*args)
-      update_schema
+      self.class.update_schema
+      self.class.update_methods
       super
     end
-  
-    private
-  
-    def update_schema
-      ActiveRecord::Migration.create_table(self.class.table_name) do |t|;end; unless self.class.table_exists?
-      self.class.schema_columns.each do |column|
-        ActiveRecord::Migration.add_column(self.class.table_name, column, :string) unless respond_to?(column.to_sym)
-        (self.class.column_names - self.class.protected_columns).each do |column|
-          ActiveRecord::Migration.remove_column(self.class.table_name, column) unless self.class.schema_columns.include?(column.to_s)
-        end
-      end
-    end
   end
 end
+
+ActiveRecord::Base.extend(Schemer)</diff>
      <filename>lib/schemer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,2 @@
+raise &quot;We highly suggest you only use Schemer in development mode!&quot; unless Rails.env.to_s == 'development'
 require 'schemer'
-raise &quot;We would highly suggest you only use Schemer in development mode!&quot; unless Rails.env.to_s == 'development'
-ActiveRecord::Base.extend(Schemer)
\ No newline at end of file</diff>
      <filename>rails/init.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
 
   s.specification_version = 2 if s.respond_to? :specification_version=
 
-  s.files = &lt;%= FileList['lib/**/*.rb', 'README*', 'LICENSE', 'Rakefile', 'rails/**/*', 'test/**/*.*'].inspect %&gt;
+  s.files = &lt;%= FileList['lib/**/*.rb', 'README*', 'LICENSE', 'Rakefile', 'rails/**/*', 'test/**/*.rb'].inspect %&gt;
 
   s.require_paths = ['lib']
 </diff>
      <filename>schemer.gemspec.erb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,43 @@
-require File.dirname(__FILE__) + &quot;/../lib/contest&quot;
+require 'rubygems'
+require 'contest'
+require File.join(File.dirname(__FILE__), '..', 'lib', 'schemer')
 
-class FooTest &lt; Contest::Unit::TestCase
-  # coming soon, tests!
+ActiveRecord::Base.establish_connection :adapter =&gt; 'sqlite3', :database =&gt; 'test/schemer_test.db'
+ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), &quot;debug.log&quot;))
+
+class Foo &lt; ActiveRecord::Base;end;
+ActiveRecord::Migration.drop_table(Foo.table_name) if Foo.table_exists?
+
+class FooTest &lt; Test::Unit::TestCase  
+  context &quot;defining the schema&quot; do
+    setup do
+      Foo.schema :foo, :bar
+      @foo = Foo.new
+    end
+    
+    should &quot;create the foos table&quot; do
+      assert Foo.table_exists?
+    end
+    
+    should &quot;create the foo column&quot; do
+      assert @foo.respond_to?(:foo)
+    end
+
+    should &quot;create the bar column&quot; do
+      assert @foo.respond_to?(:bar)
+    end
+  end
+  
+  context &quot;updating the schema&quot; do
+    setup do
+      Foo.schema :foo, :bar
+      @foo = Foo.new
+      Foo.schema :foo
+      @foo = Foo.new
+    end
+    
+    should &quot;remove the bar column&quot; do
+      assert !@foo.respond_to?(:bar)
+    end
+  end
 end</diff>
      <filename>test/schemer_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a16894a402f67a4d6bf657b73c25227c99e7a753</id>
    </parent>
  </parents>
  <author>
    <name>benalavi</name>
    <email>benalavi@gmail.com</email>
  </author>
  <url>http://github.com/citrusbyte/schemer/commit/3d22e9c15fcc5034e7d74e0f2b2a52dee288cb31</url>
  <id>3d22e9c15fcc5034e7d74e0f2b2a52dee288cb31</id>
  <committed-date>2009-04-03T18:50:24-07:00</committed-date>
  <authored-date>2009-04-03T18:50:24-07:00</authored-date>
  <message>added tests, refactored quite a bit, fixed some bugs</message>
  <tree>76adbee9b08ed4fbb2e807ee306af7e771609fcd</tree>
  <committer>
    <name>benalavi</name>
    <email>benalavi@gmail.com</email>
  </committer>
</commit>
