<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,4 @@
-== 4ab0b0 2008-07-07
+== 0.4.5 2008-07-08
   * Add: support for optional dependencies through the :required option. Default (true).
   * Add: Basic test cases of classy-inheritance depends_on functionality.
 == 0.4.4 2008-06-24</diff>
      <filename>History.txt</filename>
    </modified>
    <modified>
      <diff>@@ -27,15 +27,21 @@ module Stonean
         define_relationship(model_sym,options)
 
         # Optional presence of handling
-        if options.has_key?(:required) &amp;&amp; options[:required] != true
-          if [Symbol, String, Proc].include?(options[:required].class)
-            validates_presence_of model_sym, :if =&gt; options[:required]
+        if options.has_key?(:validates_presence_if) &amp;&amp; options[:validates_presence_if] != true
+          if [Symbol, String, Proc].include?(options[:validates_presence_if].class)
+            validates_presence_of model_sym, :if =&gt; options[:validates_presence_if]
           end
         else
           validates_presence_of model_sym
         end
 
-        validates_associated model_sym
+        if options.has_key?(:validates_associated_if) &amp;&amp; options[:validates_associated_if] != true
+          if [Symbol, String, Proc].include?(options[:validates_assoicated_if].class)
+            validates_associated model_sym, :if =&gt; options[:validates_associated_if]
+          end
+        else
+          validates_associated model_sym
+        end
 
         # Before save functionality to create/update the requisite object
         define_save_method(model_sym, options[:as])
@@ -71,9 +77,19 @@ module Stonean
 
       private
 
+      def classy_options
+        [:as, :attrs, :prefix, :validates_presence_if, :validates_associated_if]
+      end
+
+      def delete_classy_options(options, *keepers)
+        options.delete_if do |key,value|
+          classy_options.include?(key) &amp;&amp; !keepers.include?(key)
+        end
+        options
+      end
+
       def define_relationship(model_sym, options)
-        opts = options.dup
-        [:attrs, :prefix, :required].each{|key| opts.delete(key)}
+        opts = delete_classy_options(options.dup, :as)
         if opts[:as]
           as_opt = opts.delete(:as)
           opts = polymorphic_constraints(as_opt).merge(opts)
@@ -85,12 +101,17 @@ module Stonean
 
       def define_save_method(model_sym, polymorphic_name = nil)
         define_method &quot;save_requisite_#{model_sym}&quot; do
+          # Return unless the association exists
+          eval(&quot;return unless self.#{model_sym}&quot;)
+
+          # Set the polymorphic type and id before saving
           if polymorphic_name
             eval(&quot;self.#{model_sym}.#{polymorphic_name}_type = self.class.name&quot;)
             eval(&quot;self.#{model_sym}.#{polymorphic_name}_id = self.id&quot;)
           end
 
           if polymorphic_name
+            # Save only if it's an update, has_one creates automatically
             eval &lt;&lt;-SAVEIT
               unless self.#{model_sym}.new_record?
                 self.#{model_sym}.save</diff>
      <filename>lib/classy-inheritance.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,6 +16,10 @@ class TestClassyInheritance &lt; Test::Unit::TestCase
     assert ActiveRecord::Base.respond_to?(:depends_on)
   end
   
+  def test_user_should_respond_to_find_with_profile
+    assert User.respond_to?(:find_with_profile)
+  end
+
   def test_user_should_respond_to_first_name
     assert @user.respond_to?(:first_name)
   end</diff>
      <filename>test/test_classy-inheritance.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,12 +32,65 @@ class SetupTestTables &lt; ActiveRecord::Migration
 
       t.timestamps
     end
+
+    create_table :artists, :force =&gt; true do |t|
+      t.string :login
+      t.integer :profile_id
+
+      t.timestamps
+    end
+
+    create_table :addresses, :force =&gt; true do |t|
+      t.string :line_one
+      t.string :line_two
+      t.string :city
+      t.string :state_code
+      t.string :postal_code
+
+      t.timestamps
+    end
+
+    create_table :offices, :force =&gt; true do |t|
+      t.string :name
+      t.integer :billing_address_id
+      t.integer :shipping_address_id
+
+      t.timestamps
+    end
+
+    create_table :contents, :force =&gt; true do |t|
+      t.string :name
+      t.string :presentable_type 
+      t.integer :presentable_id
+
+      t.timestamps
+    end
+
+    create_table :pages, :force =&gt; true do |t|
+      t.text :body
+
+      t.timestamps
+    end
+
+    create_table :documents, :force =&gt; true do |t|
+      t.string :version_file_name
+      t.string :version_content_type
+      t.integer :version_file_size
+
+      t.timestamps
+    end
   end
   
   def self.down
     drop_table :authors
+    drop_table :artists
     drop_table :users
     drop_table :profiles
+    drop_table :offices
+    drop_table :addresses
+    drop_table :pages
+    drop_table :documents
+    drop_table :contents
   end
 end
 
@@ -54,3 +107,30 @@ end
 class Author &lt; ActiveRecord::Base
   validates_presence_of :login
 end
+
+# to test optional dependency
+class Artist &lt; ActiveRecord::Base
+  validates_presence_of :login
+end
+
+# to test using standard relationship options (class_name, etc..)
+class Address &lt; ActiveRecord::Base
+  validates_presence_of :line_one, :city, :postal_code
+end
+
+class Office &lt; ActiveRecord::Base
+  validates_presence_of :name
+end
+
+# Polymorphic classes
+class Content &lt; ActiveRecord::Base
+  validates_presence_of :name
+end
+
+class Page &lt; ActiveRecord::Base
+  validates_presence_of :body
+end
+
+# Would typically use PaperClip for this...
+class Document &lt; ActiveRecord::Base
+end</diff>
      <filename>test/test_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,18 @@
 require File.dirname(__FILE__) + '/test_helper.rb'
 
 class TestWithOptionalDependency &lt; Test::Unit::TestCase
-  Author.depends_on :profile, :required =&gt; false, 
+  # Turn off the validates_presence_of call
+  Author.depends_on :profile, :validates_presence_if =&gt; false, 
     :attrs =&gt; [:first_name, :last_name, :email]
   
+  # Turn off the validates_presence_of and the validates_associated calls
+  Artist.depends_on :profile, :validates_presence_if =&gt; false, 
+    :validates_associated_if =&gt; false,
+    :attrs =&gt; [:first_name, :last_name, :email]
+
   def setup
     @author = Author.new
+    @artist = Artist.new
   end
   
   def test_author_should_be_valid_without_profile
@@ -32,5 +39,21 @@ class TestWithOptionalDependency &lt; Test::Unit::TestCase
     
     assert @author.valid?
   end
+
+  def test_artist_should_not_save_with_invalid_profile
+    @artist.login = 'joe'
+    @artist.first_name = 'joe'
+    
+    assert !@artist.save
+  end
+
+  def test_artist_should_save_with_valid_profile
+    @artist.login = 'joe'
+    @artist.first_name = 'joe'
+    @artist.last_name = 'bloggs'
+    @artist.email = 'joe@bloggs.co.uk'
+    
+    assert @artist.save
+  end
   
 end</diff>
      <filename>test/test_with_optional_dependency.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>daecd676ebc0a4b7284acc274dcef7c113922a88</id>
    </parent>
  </parents>
  <author>
    <name>Andrew Stone</name>
    <email>andy@stonean.com</email>
  </author>
  <url>http://github.com/stonean/classy-inheritance/commit/0b5ecf02c674d67df597c8bb62f132b4c8ab9f76</url>
  <id>0b5ecf02c674d67df597c8bb62f132b4c8ab9f76</id>
  <committed-date>2008-07-08T15:51:12-07:00</committed-date>
  <authored-date>2008-07-08T15:51:12-07:00</authored-date>
  <message>changed validates_presence_of_if to validates_presence_if</message>
  <tree>6c3bd0ad5ea2054d208f1104b5ddacd5984786f8</tree>
  <committer>
    <name>Andrew Stone</name>
    <email>andy@stonean.com</email>
  </committer>
</commit>
