module AcceptNestedAttributesForMemberTrait
  as_trait do |association|

    define_method "#{association}_attributes=" do |attrs|
      send(association).attributes = attrs
    end

    validate_association_method = "validate_#{association}"
    validate validate_association_method

    save_association_method = "save_#{association}"
    after_save save_association_method

    private

    define_method validate_association_method do
      text = send(association)
      if text && !text.valid?
        errors.add(association)
      end
      true
    end

    define_method save_association_method do
      text = send(association)
      if text
        text.save(:validate => false)
      end
    end

    define_method "nested_records_changed_for_autosave_with_#{association}?" do
      send("nested_records_changed_for_autosave_without_#{association}?") || send(association).changed?
    end

    alias_method_chain :nested_records_changed_for_autosave?, association

  end
end
