From: Wyss Clemens Date: 2001-05-08T01:08:59+09:00 Subject: [ruby-talk:14786] Re: SimpleDelegator assymetry > -----Urspr�ngliche Nachricht----- > Von: Dave Thomas [mailto:Dave@PragmaticProgrammer.com] > Gesendet am: Montag, 7. Mai 2001 17:39 > An: ruby-talk@ruby-lang.org; ruby-talk@netlab.co.jp > Betreff: [ruby-talk:14784] Re: AW: Re: SimpleDelegator assymetry > > Wyss Clemens writes: > > > I have a somewhat "not so fast solution" ;-): > > This will have a different behavior to the original delegate.rb. This > code will not delegate a method that already exists in the delegating > class, while the original will. Robert, looks like this was meant by the comment in delegate.rb! > Which is correct is yet to be determined :) > But as Dave says, the question remains which of the behaviors is correct! Below (not tested though) find a (possibly) more generic approach. No subclassing needed, as this is a "wrapper approach"! class SimpleDelegatorBase def initialize(original_obj, delegatee = nil) @__originial_obj = original_obj @__delegatee = delegatee end def __setobj__(object) @__delegatee = object end def method_missing(method, *args) receivers().each { | receiver | safley_send(receiver, method, args) } end def safely_send(receiver, method, *args) if receiver.respond_to?(method) then if args.size() == 0 then receiver.send(method) else receiver.send(method, args) end end end def receivers() [@__original_obj] end end class SimpleDelegatorOriginalPrecedence < SimpleDelegatorBase # special behavior here ("either-or") def method_missing(method, *args) if @__originial_obj.respond_to?(method) then safley_send(@__originial_obj, method, args) else safely_send(@__delegatee, method, args) end end end class SimpleDelegatorSubstitute < SimpleDelegatorBase def receivers() [@__delegatee] end end class SimpleDelegatorPreCall < SimpleDelegatorBase def receivers() [@__delegatee, @__original_obj] end end class SimpleDelegatorPostCall < SimpleDelegatorBase def receivers() [@__original_obj, @__delegatee] end end ;-) Clemens