class Talk::Registry

Public Class Methods

add(name, namespace, file, line, delimiter=nil) click to toggle source
# File lib/registry.rb, line 57
def add(name, namespace, file, line, delimiter=nil)
  if registered?(name, namespace) then
    old_reg = get_registrations(name, namespace).last
    Talk::Parser.error(nil, file, line, "Duplicate registration #{name} in #{namespace}; previously defined at #{old_reg}")
  end

  @registry ||= {}
  @registry[namespace] ||= {}
  split_name = delimiter.nil? ? [*name] : name.to_s.split(delimiter)

  # create each level of the split name
  level = @registry[namespace]
  split_name[0..-2].each do |component| # all but the last component
    level[component] ||= RegistryEntry.new
    level = level[component]
  end

  level[split_name.last] ||= RegistryEntry.new(name, file, line)
  level[split_name.last].make_entry(name, file, line) # in case it already existed as a container
  add_reverse_lookup(split_name, namespace, level[split_name.last], delimiter)
end
add_reverse_lookup(split_name, namespace, entry, delimiter) click to toggle source
# File lib/registry.rb, line 79
def add_reverse_lookup(split_name, namespace, entry, delimiter)
  @reverse ||= {}
  @reverse[namespace] ||= {}
  split_name.reverse.each_prefix do |prefix|
    name = prefix.reverse.join(delimiter)
    @reverse[namespace][name] ||= []
    @reverse[namespace][name].push entry
  end
end
get_exact_registrations(name, namespace) click to toggle source
# File lib/registry.rb, line 99
def get_exact_registrations(name, namespace)
  level = @registry[namespace]
  [*name].each do |component|
    return [] if level.nil?
    level = level[component]
  end

  return [*level] if not level.nil? and level.is_entry?
  []
end
get_inexact_registrations(name, namespace) click to toggle source
# File lib/registry.rb, line 110
def get_inexact_registrations(name, namespace)
  return [] if @reverse.nil? or @reverse[namespace].nil? or @reverse[namespace][name].nil?
  @reverse[namespace][name]
end
get_registrations(name, namespace, match_exact = false) click to toggle source
# File lib/registry.rb, line 89
def get_registrations(name, namespace, match_exact = false)
  @registry ||= {}
  exact = get_exact_registrations(name, namespace)
  
  return exact unless exact.empty?
  return [] if match_exact

  get_inexact_registrations(name, namespace)
end
registered?(name, namespace, match_exact = false) click to toggle source
# File lib/registry.rb, line 115
def registered?(name, namespace, match_exact = false)
  not get_registrations(name, namespace, match_exact).empty?
end
render_level(level, at_depth=1) click to toggle source
# File lib/registry.rb, line 119
def render_level(level, at_depth=1)
  indent = "    "*at_depth
  s = ""
  level.keys.sort.each do |key|
    value = level[key]
    s += indent + key
    s += " (entry from #{File.basename(value.file)}:#{value.line})" if value.is_entry?
    s += "\n"
    s += render_level(value, at_depth+1)
  end

  s
end
reset() click to toggle source
# File lib/registry.rb, line 133
def reset
  @registry = nil
  @reverse = nil
end
to_s() click to toggle source
# File lib/registry.rb, line 138
def to_s
  return "Empty registry" if @registry.nil? or @registry.empty?
  s = ""
  @registry.keys.sort.each do |namespace|
    level = @registry[namespace]
    s += "Namespace #{namespace}:\n"
    s += render_level(level)
  end

  s
end