From 5fc8af4712ea5b5f7a2ee8bedb3b431901de814d Mon Sep 17 00:00:00 2001
From: Xavier Noria <fxn@hashref.com>
Date: Tue, 10 Aug 2010 03:59:26 +0200
Subject: AS guide: documents Module#redefine_method

---
 .../source/active_support_core_extensions.textile   | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

(limited to 'railties')

diff --git a/railties/guides/source/active_support_core_extensions.textile b/railties/guides/source/active_support_core_extensions.textile
index e0c69516cf..31433d50eb 100644
--- a/railties/guides/source/active_support_core_extensions.textile
+++ b/railties/guides/source/active_support_core_extensions.textile
@@ -1078,6 +1078,27 @@ self.field_helpers = (FormHelper.instance_method_names - ['form_for'])
 
 NOTE: Defined in +active_support/core_ext/module/method_names.rb+
 
+h4. Redefining Methods
+
+There are cases where you need to define a method with +define_method+, but don't know whether a method with that name already exists. If it does, a warning is issued if they are enabled. No big deal, but not clean either.
+
+The method +redefine_method+ prevents such a potential warning, removing the existing method before if needed. Rails uses it in a few places, for instance when it generates an association's API:
+
+<ruby>
+redefine_method("#{reflection.name}=") do |new_value|
+  association = association_instance_get(reflection.name)
+
+  if association.nil? || association.target != new_value
+    association = association_proxy_class.new(self, reflection)
+  end
+
+  association.replace(new_value)
+  association_instance_set(reflection.name, new_value.nil? ? nil : association)
+end
+</ruby>
+
+NOTE: Defined in +active_support/core_ext/module/remove_method.rb+
+
 h3. Extensions to +Class+
 
 h4. Class Attributes
-- 
cgit v1.2.3