From 3b1537a7d1c19d7f4ab6ae1a405ec4c2c186a55c Mon Sep 17 00:00:00 2001 From: Daniel Schierbeck Date: Thu, 1 Sep 2011 15:23:32 +0200 Subject: [PATCH] Document the changes to delegate in the guides --- .../active_support_core_extensions.textile | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/guides/source/active_support_core_extensions.textile b/guides/source/active_support_core_extensions.textile index 5d0a3f82e8c22..181dac72cf266 100644 --- a/guides/source/active_support_core_extensions.textile +++ b/guides/source/active_support_core_extensions.textile @@ -883,6 +883,26 @@ delegate :size, :to => :attachment, :prefix => :avatar In the previous example the macro generates +avatar_size+ rather than +size+. +WARNING: You can only delegate to public methods on the target object. Trying to delegate to a private or protected method will raise a +NoMethodError+ when the delegate is called. + +If you need to delegate to a private or protected method, you will need to implement the delegation method yourself. It's usually rather simple to do using +__send__+: + + +class Wrapper + def initialize + # Target#zizzle is a private method. + @target = Target.new + end + + def zizzle(*args, &block) + # __send__ circumvents the private/protected mechanism. + @target.__send__(:zizzle, *args, &block) + end +end + + +Since +__send__+ can be used to call private and protected methods, this will not raise a +NoMethodError+. + NOTE: Defined in +active_support/core_ext/module/delegation.rb+ h4. Redefining Methods