4 Trabes

delegate_method versión 2

Publicado por el Jueves, 17 de Abril de 2008

Hace tiempo propusimos desde este blog el método Module::delegate_method como sustituto del método delegate de Rails.

El tiempo ha pasado y después de usarlo mucho hemos decidido simplificarlo, cambiar su sintaxis y, como entonces, ponerlo a disposición de todo el que lo quiera usar.

class Module

  # 
  # delegate_method :do_something, 
  #     :to => :other_object
  #
  # delegate_method :do_other_thing,
  #     :to => :another_object, 
  #     :as => :do_something,  
  #     :default => "Can't do it" 
  #
  def delegate_method(method, options)    

     to = options[:to]
     as = options[:as] || method
     default = options[:default] 

     raise ArgumentError(':to param is mandatory') if to.blank?

     module_eval %{
       def #{method}(*args, &block)                
         #{to}.__send__(:#{as}, *args, &block) || #{default.inspect}        
       end
     }
  end
end

Tu comentario