module SpacesAreOk::ClassesAndModules

Public Class Methods

get_class(original_name, superclass = Object, &class_definition) click to toggle source
# File lib/spaces_are_ok/classes_and_modules.rb, line 2
def self.get_class(original_name, superclass = Object, &class_definition)
  creator = -> { Class.new(superclass) }
  define_or_get_module_or_class(
    original_name,
    Class,
    :class_eval,
    creator,
    &class_definition
  )
end
get_module(original_name, &module_definition) click to toggle source
# File lib/spaces_are_ok/classes_and_modules.rb, line 13
def self.get_module(original_name, &module_definition)
  creator = -> { Module.new }
  define_or_get_module_or_class(
    original_name,
    Module,
    :module_eval,
    creator,
    &module_definition
  )
end

Private Class Methods

closest_existing_name_for(name, type) click to toggle source
# File lib/spaces_are_ok/classes_and_modules.rb, line 49
def self.closest_existing_name_for(name, type)
  names = Module.constants.select do |c|
    next if c.to_s == 'Config' # Get rid of RbConfig/Config warning
    Module.const_get(c).is_a?(type)
  end

  SpacesAreOk::find_a_matching_name(names, name)
end
define_or_get_module_or_class(original_name, type, evaluator, creator, &body) click to toggle source
# File lib/spaces_are_ok/classes_and_modules.rb, line 26
def self.define_or_get_module_or_class(original_name, type, evaluator, creator, &body)
  name = get_name(original_name, type)

  if !Object.const_defined?(name)
    Object.const_set(name, creator.call)
  end

  module_or_class = Object.const_get(name)

  if !body.nil?
    module_or_class.send(evaluator, &body)
  end

  module_or_class
end
get_name(original_name, type) click to toggle source
# File lib/spaces_are_ok/classes_and_modules.rb, line 42
def self.get_name(original_name, type)
  name = valid_class_or_module_name_from(original_name)
  close_enough = closest_existing_name_for(name, type)
  name = close_enough unless close_enough.nil?
  name
end
valid_class_or_module_name_from(original_name) click to toggle source
# File lib/spaces_are_ok/classes_and_modules.rb, line 58
def self.valid_class_or_module_name_from(original_name)
  name = SpacesAreOk::make_a_valid_name(original_name, '')
  name = "a_#{name}" if name.match(%r<^ [^a-z] >x)
  name.capitalize
end