module Racket::Registry::Helper
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