module Attire

Public Class Methods

attire(base, param_str, method: :initialize, verb: nil, &after) click to toggle source
# File lib/attire.rb, line 3
def attire(base, param_str, method: :initialize, verb: nil, &after)
  names = eval("->(#{param_str}){}").parameters.map(&:last)
  def_init(base, param_str, method, names)
  add_getters(base, names)
  base.send(:define_method, :__after) { instance_exec(&after) if after }
  def_verb(base, verb) if verb
end

Private Class Methods

add_getters(base, names) click to toggle source
# File lib/attire.rb, line 21
def add_getters(base, names)
  base.send(:attr_reader, *names)
  base.send(:private, *names)
end
def_init(base, param_str, method, names) click to toggle source
# File lib/attire.rb, line 13
def def_init(base, param_str, method, names)
  base.class_eval "def #{method}(#{param_str})\n#{ivars(names)}\n__after\nend"
end
def_verb(base, verb) click to toggle source
# File lib/attire.rb, line 26
def def_verb(base, verb)
  base.define_singleton_method(verb) { |*a, &b| new(*a, &b).send(verb) }
end
ivars(names) click to toggle source
# File lib/attire.rb, line 17
def ivars(names)
  names.map { |name| "@#{name} = #{name}\n" }.join
end