module ClassSpecific

Public Instance Methods

after_construct(&block) click to toggle source
# File lib/services/class_specific.rb, line 11
def after_construct(&block)
  @__construct_callback__ = block
end
construct_class(klass, callback_args: []) click to toggle source
# File lib/services/class_specific.rb, line 3
def construct_class(klass, callback_args: [])
  __constructor__(klass, callback_args) { |name| __define_subclass__ name, self }
end
construct_module(klass, callback_args: []) click to toggle source
# File lib/services/class_specific.rb, line 7
def construct_module(klass, callback_args: [])
  __constructor__(klass, callback_args) { |name| __define_submodule__ name, self }
end

Private Instance Methods

__constructor__(klass, callback_args) { |name| ... } click to toggle source
# File lib/services/class_specific.rb, line 17
def __constructor__(klass, callback_args)
  return self if !(name = __get_constant_name__(klass))
  return const_get name, false  if const_defined? name.to_sym, false

  constant = yield name
  __invoke_callback__(constant, klass, *callback_args) if @__construct_callback__
  constant
end
__define_subclass__(name, parent) click to toggle source
# File lib/services/class_specific.rb, line 31
def __define_subclass__(name, parent)
  parent.const_set(name, Class.new(parent))
end
__define_submodule__(name, parent) click to toggle source
# File lib/services/class_specific.rb, line 35
def __define_submodule__(name, parent)
  parent.const_set(name, parent.clone)
end
__get_constant_name__(constant) click to toggle source
# File lib/services/class_specific.rb, line 39
def __get_constant_name__(constant)
  (name = constant.to_s) ? name.slice(/(?=\:\:)?\w+$/) : nil
end
__invoke_callback__(constant, klass, *args) click to toggle source
# File lib/services/class_specific.rb, line 26
def __invoke_callback__(constant, klass, *args)
  eval_method = constant.is_a?(Class) ? :class_exec : :module_exec
  constant.send(eval_method, klass, *args, &@__construct_callback__)
end