module Racket::Registry::Helper

Private helper module for Racket Registry

Public Class Methods

forget(options) click to toggle source

Private method - do not call

# File lib/racket/registry.rb, line 95
def self.forget(options)
  obj, methods, key = validate_existing(options)
  unless methods.include?(key)
    raise KeyNotRegisteredError,
          "Key #{key} is not registered"
  end
  obj.singleton_class.instance_eval do
    @resolved.delete(key) if defined?(@resolved)
    remove_method(key)
  end && nil
end
forget_all(options) click to toggle source

Private method - do not call

# File lib/racket/registry.rb, line 108
def self.forget_all(options)
  obj, methods, = validate_existing(options)
  obj.singleton_class.instance_eval do
    @resolved.clear if defined?(@resolved)
    methods.each { |meth| remove_method(meth) }
  end && nil
end
register(options) click to toggle source

Private method - do not call

# File lib/racket/registry.rb, line 117
def self.register(options)
  key, proc, proc_args, obj = validate_usable(options)
  obj.define_singleton_method(key) do
    proc.call(*proc_args)
  end && nil
end
register_singleton(options) click to toggle source

Private method - do not call

# File lib/racket/registry.rb, line 125
def self.register_singleton(options)
  key, proc, proc_args, obj = validate_usable(options)
  resolved = resolved(options[:obj])
  obj.define_singleton_method(key) do
    return resolved[key] if resolved.key?(key)
    resolved[key] = proc.call(*proc_args)
  end && nil
end

Private Class Methods

resolved(obj) click to toggle source
# File lib/racket/registry.rb, line 134
def self.resolved(obj)
  obj.singleton_class.instance_eval { @resolved ||= {} }
end
validate_callback(proc, block) click to toggle source
# File lib/racket/registry.rb, line 157
def self.validate_callback(proc, block)
  return proc if proc.respond_to?(:call)
  return block if block.respond_to?(:call)
  raise InvalidCallbackError, 'Invalid callback'
end
validate_existing(options) click to toggle source
# File lib/racket/registry.rb, line 138
def self.validate_existing(options)
  result = [options[:obj]]
  result << result.first.singleton_methods
  key = options.fetch(:key, nil)
  result << key.to_sym if key
  result
end
validate_key(key, obj) click to toggle source
# File lib/racket/registry.rb, line 146
def self.validate_key(key, obj)
  sym = key.to_sym
  insp = key.inspect
  raise KeyAlreadyRegisteredError, "Key #{insp} already registered" if
    obj.singleton_methods.include?(sym)
  raise InvalidKeyError, "Invalid key #{insp}" if
    obj.public_methods.include?(sym) ||
    /^[a-z_][\d\w_]*$/ !~ sym
  sym
end
validate_usable(options) click to toggle source
# File lib/racket/registry.rb, line 163
def self.validate_usable(options)
  obj = options[:obj]
  key = validate_key(options[:key], obj)
  proc = validate_callback(options[:proc], options[:block])
  [key, proc, proc.arity.zero? ? [] : [obj], obj]
end