diff options
author | Daniel Schierbeck <daniel.schierbeck@gmail.com> | 2011-10-11 15:38:17 +0200 |
---|---|---|
committer | Daniel Schierbeck <dasch@zendesk.com> | 2012-04-12 13:47:52 +0200 |
commit | 402a119ddb886cc60b6e6c120aff964a6d4780af (patch) | |
tree | d73ac94c0eb56ce54e6b0f1030a720b0ddfd6ffc | |
parent | 3b1537a7d1c19d7f4ab6ae1a405ec4c2c186a55c (diff) | |
download | rails-402a119ddb886cc60b6e6c120aff964a6d4780af.tar.gz rails-402a119ddb886cc60b6e6c120aff964a6d4780af.tar.bz2 rails-402a119ddb886cc60b6e6c120aff964a6d4780af.zip |
Add back the old `deprecate` method as `deprecate!`
-rw-r--r-- | activesupport/lib/active_support/core_ext/module/delegation.rb | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/module/delegation.rb b/activesupport/lib/active_support/core_ext/module/delegation.rb index ee8adae1cb..b927059c6b 100644 --- a/activesupport/lib/active_support/core_ext/module/delegation.rb +++ b/activesupport/lib/active_support/core_ext/module/delegation.rb @@ -156,4 +156,56 @@ class Module end end end + + def delegate!(*methods) + ActiveSupport::Deprecation.warn('Delegating to non-public methods is deprecated.', caller) + + options = methods.pop + unless options.is_a?(Hash) && to = options[:to] + raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)." + end + prefix, to, allow_nil = options[:prefix], options[:to], options[:allow_nil] + + if prefix == true && to.to_s =~ /^[^a-z_]/ + raise ArgumentError, "Can only automatically set the delegation prefix when delegating to a method." + end + + method_prefix = + if prefix + "#{prefix == true ? to : prefix}_" + else + '' + end + + file, line = caller.first.split(':', 2) + line = line.to_i + + methods.each do |method| + method = method.to_s + + if allow_nil + module_eval(<<-EOS, file, line - 2) + def #{method_prefix}#{method}(*args, &block) # def customer_name(*args, &block) + if #{to} || #{to}.respond_to?(:#{method}) # if client || client.respond_to?(:name) + #{to}.__send__(:#{method}, *args, &block) # client.__send__(:name, *args, &block) + end # end + end # end + EOS + else + exception = %(raise "#{self}##{method_prefix}#{method} delegated to #{to}.#{method}, but #{to} is nil: \#{self.inspect}") + + module_eval(<<-EOS, file, line - 1) + def #{method_prefix}#{method}(*args, &block) # def customer_name(*args, &block) + #{to}.__send__(:#{method}, *args, &block) # client.__send__(:name, *args, &block) + rescue NoMethodError # rescue NoMethodError + if #{to}.nil? # if client.nil? + #{exception} # # add helpful message to the exception + else # else + raise # raise + end # end + end # end + EOS + end + end + end end |