Ruby Metaprogramming: Dynamically defining method based on child instance attribute -
i'm creating presenter base class supposed wrap activerecord object.
class basepresenter def initialize object @object = object end def method_missing(*args, &block) @object.send(*args, &block) end def self.wrap collection collection.map { |item| new item } end end for each child class, able dynamically define method based on child attribute @ initialization, listpresenter like:
class listpresenter < basepresenter end should respond list_id wrapped list object's id.
how short of defining on every child class? i've tried following in def initialize(object), both of not work. prefer avoid eval based approaches if possible hear it's code smell.
class approach (adds method basepresenter, not child classes)
self.class.send(:define_method, "#{object.class.name.underscore}_id") @object.id end metaclass approach (unable access instance variables object or @object):
class << self define_method "#{@object.class.name.underscore}_id" @object.id end end
use class#inherited hook dynamically add method whenever sub-class inherits basepresenter.
class basepresenter def self.inherited(sub_klass) sub_klass.send(:define_method, "#{sub_klass.name.underscore.split("_")[0...-1].join("_")}_id") instance_variable_get("@object").id end end end class listpresenter < basepresenter end # sending rails model object below l = listpresenter.new(user.first) l.list_id #=> 1
Comments
Post a Comment