module Alias2

Constants

VERSION

Public Class Methods

alias(namespace, aliases = nil) { |klass| ... } click to toggle source
# File lib/alias2.rb, line 7
def alias(namespace, aliases = nil)
  raise ArgumentError, "you must provide an alias or a block" if aliases.nil? && !block_given?

  namespace = constant(namespace)
  aliases = find_names(namespace) if aliases.nil? || aliases == "*"

  if aliases.is_a?(String)
    set(namespace, aliases)
    return
  end

  aliases.each do |target, alias_as|
    klass = namespace.const_get(target)
    if block_given?
      keep_or_alias = yield klass
      next unless keep_or_alias
      # Block returned a new alias
      alias_as = keep_or_alias if keep_or_alias != true
    end

    set(klass, (alias_as || target).to_s)
  end

  nil
end

Private Class Methods

constant(namespace) click to toggle source
# File lib/alias2.rb, line 35
def constant(namespace)
  return namespace if namespace.is_a?(Module)
  Object.const_get(namespace)
end
find_and_or_create_namespace(str) click to toggle source

Stolen from class2: github.com/sshaw/class2

# File lib/alias2.rb, line 51
def find_and_or_create_namespace(str)
  parts = str.split("::")
  namespace = parts[0..-2].inject(Object) do |parent, child|
    # empty? to handle "::Namespace"
    child.empty? ? parent : parent.const_defined?(child) ?
                              # With 2.1 we can just say Object.const_defined?(str) but keep this around for now.
                              parent.const_get(child) : parent.const_set(child, Module.new)
  end

  [ namespace, parts[-1] ]
end
find_names(namespace) click to toggle source
# File lib/alias2.rb, line 40
def find_names(namespace)
  names = []
  namespace.constants.each do |name|
    const = namespace.const_get(name)
    names << name if const.is_a?(Module)
  end

  names
end
set(target, alias_as) click to toggle source
# File lib/alias2.rb, line 63
def set(target, alias_as)
  namespace = Object

  if alias_as.include?("::")
    namespace, alias_as = find_and_or_create_namespace(alias_as)
  end

  if namespace.const_defined?(alias_as)
    const = namespace != Object ? "#{namespace}::#{alias_as}" : alias_as
    raise NameError, "constant #{const} is already defined"
  end

  namespace.const_set(alias_as, target)
end