Skip to content

Commit 717d395

Browse files
committed
merges r20385 from trunk into ruby_1_9_1.
-- * lib/foerwardable.rb: should be usable def_single_delegator for Class and Module. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@24174 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 38687be commit 717d395

File tree

3 files changed

+118
-19
lines changed

3 files changed

+118
-19
lines changed

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Fri Nov 28 17:52:26 2008 Keiju Ishitsuka <keiju@ruby-lang.org>
2+
3+
* lib/foerwardable.rb: should be usable def_single_delegator for
4+
Class and Module.
5+
[ruby-dev:38815]
6+
17
Thu Jul 16 18:28:09 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
28

39
* id.c (Init_id), vm.c (vm_exec): @#__ThrowState__ is no longer

lib/forwardable.rb

Lines changed: 111 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,30 @@
7070
# Ruby
7171
# nil
7272
#
73-
# Forwardable can be used to setup delegation at the object level as well.
73+
# SingleForwardable can be used to setup delegation at the object level as well.
7474
#
7575
# printer = String.new
76+
# printer.extend SingleForwardable # prepare object for delegation
77+
# printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts()
78+
# printer.puts "Howdy!"
79+
#
80+
# Also, SingleForwardable can be use to Class or Module.
81+
#
82+
# module Facade
83+
# extend SingleForwardable
84+
# def_delegator :Implementation, :service
85+
#
86+
# class Implementation
87+
# def service...
88+
# end
89+
# end
90+
#
91+
# If you want to use both Forwardable and SingleForwardable, you can
92+
# use methods def_instance_delegator and def_single_delegator, etc.
93+
#
94+
# If the object isn't a Module and Class, You can too extend
95+
# Forwardable module.
96+
# printer = String.new
7697
# printer.extend Forwardable # prepare object for delegation
7798
# printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts()
7899
# printer.puts "Howdy!"
@@ -111,8 +132,13 @@
111132
# Also see the example at forwardable.rb.
112133

113134
module Forwardable
114-
FORWARDABLE_VERSION = "1.0.0"
115-
135+
FORWARDABLE_VERSION = "1.1.0"
136+
137+
@debug = nil
138+
class<<self
139+
attr_accessor :debug
140+
end
141+
116142
# Takes a hash as its argument. The key is a symbol or an array of
117143
# symbols. These symbols correspond to method names. The value is
118144
# the accessor to which the methods will be delegated.
@@ -121,7 +147,7 @@ module Forwardable
121147
# delegate method => accessor
122148
# delegate [method, method, ...] => accessor
123149
#
124-
def delegate(hash)
150+
def instance_delegate(hash)
125151
hash.each{ |methods, accessor|
126152
methods = methods.to_s unless methods.respond_to?(:each)
127153
methods.each{ |method|
@@ -144,34 +170,101 @@ def delegate(hash)
144170
def def_instance_delegators(accessor, *methods)
145171
methods.delete("__send__")
146172
methods.delete("__id__")
147-
methods.each{ |method|
173+
for method in methods
148174
def_instance_delegator(accessor, method)
149-
}
175+
end
150176
end
151177

152-
#
153-
# Defines a method _method_ which delegates to _obj_ (i.e. it calls
154-
# the method of the same name in _obj_). If _new_name_ is
155-
# provided, it is used as the name for the delegate method.
156-
#
157178
def def_instance_delegator(accessor, method, ali = method)
158-
str = %Q{
179+
line_no = __LINE__; str = %{
159180
def #{ali}(*args, &block)
160-
#{accessor}.send(:#{method}, *args, &block)
181+
begin
182+
#{accessor}.__send__(:#{method}, *args, &block)
183+
rescue Exception
184+
$@.delete_if{|s| %r"#{Regexp.quote(__FILE__)}"o =~ s} unless Forwardable::debug
185+
::Kernel::raise
186+
end
161187
end
162188
}
163-
164189
# If it's not a class or module, it's an instance
165190
begin
166-
module_eval(str)
191+
module_eval(str, __FILE__, line_no)
167192
rescue
168-
instance_eval(str)
193+
instance_eval(str, __FILE__, line_no)
169194
end
195+
170196
end
171197

198+
alias delegate instance_delegate
172199
alias def_delegators def_instance_delegators
173200
alias def_delegator def_instance_delegator
174201
end
175202

176-
# compatibility
177-
SingleForwardable = Forwardable
203+
#
204+
# Usage of The SingleForwardable is like Fowadable module.
205+
#
206+
module SingleForwardable
207+
# Takes a hash as its argument. The key is a symbol or an array of
208+
# symbols. These symbols correspond to method names. The value is
209+
# the accessor to which the methods will be delegated.
210+
#
211+
# :call-seq:
212+
# delegate method => accessor
213+
# delegate [method, method, ...] => accessor
214+
#
215+
def single_delegate(hash)
216+
hash.each{ |methods, accessor|
217+
methods = methods.to_s unless methods.respond_to?(:each)
218+
methods.each{ |method|
219+
def_single_delegator(accessor, method)
220+
}
221+
}
222+
end
223+
224+
#
225+
# Shortcut for defining multiple delegator methods, but with no
226+
# provision for using a different name. The following two code
227+
# samples have the same effect:
228+
#
229+
# def_delegators :@records, :size, :<<, :map
230+
#
231+
# def_delegator :@records, :size
232+
# def_delegator :@records, :<<
233+
# def_delegator :@records, :map
234+
#
235+
def def_single_delegators(accessor, *methods)
236+
methods.delete("__send__")
237+
methods.delete("__id__")
238+
for method in methods
239+
def_single_delegator(accessor, method)
240+
end
241+
end
242+
243+
#
244+
# Defines a method _method_ which delegates to _obj_ (i.e. it calls
245+
# the method of the same name in _obj_). If _new_name_ is
246+
# provided, it is used as the name for the delegate method.
247+
#
248+
def def_single_delegator(accessor, method, ali = method)
249+
line_no = __LINE__; str = %{
250+
def #{ali}(*args, &block)
251+
begin
252+
#{accessor}.__send__(:#{method}, *args, &block)
253+
rescue Exception
254+
$@.delete_if{|s| %r"#{Regexp.quote(__FILE__)}"o =~ s} unless Forwardable::debug
255+
::Kernel::raise
256+
end
257+
end
258+
}
259+
260+
instance_eval(str, __FILE__, __LINE__)
261+
end
262+
263+
alias delegate single_delegate
264+
alias def_delegators def_single_delegators
265+
alias def_delegator def_single_delegator
266+
end
267+
268+
269+
270+

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define RUBY_VERSION "1.9.1"
22
#define RUBY_RELEASE_DATE "2009-07-16"
3-
#define RUBY_PATCHLEVEL 242
3+
#define RUBY_PATCHLEVEL 243
44
#define RUBY_VERSION_MAJOR 1
55
#define RUBY_VERSION_MINOR 9
66
#define RUBY_VERSION_TEENY 1

0 commit comments

Comments
 (0)