module MetaMissing
Public Class Methods
bind(proc, context)
click to toggle source
# File lib/meta_missing.rb, line 30 def self.bind(proc, context) proc.bind(context) end
prepended(base)
click to toggle source
# File lib/meta_missing.rb, line 21 def self.prepended(base) base.class_eval do extend ClassMethods class_attribute :method_handlers self.method_handlers = [] end end
Public Instance Methods
bind(object)
click to toggle source
# File lib/meta_missing.rb, line 9 def bind(object) block, time = self, Time.now object.class_eval do method_name = "__bind_#{time.to_i}_#{time.usec}" define_method(method_name, &block) instance_method(method_name).tap do remove_method(method_name) end end.bind(object) end
block_given?()
click to toggle source
# File lib/meta_missing.rb, line 41 def block_given?; true; end
method_missing(name, *args, &block)
click to toggle source
Calls superclass method
# File lib/meta_missing.rb, line 34 def method_missing(name, *args, &block) if handler = method_handlers.find { |handler| handler[:regexp] =~ name.to_s } match = name.to_s.match(handler[:regexp]) if block_given? class_eval do alias_method :orig_block_given?, :block_given? def block_given?; true; end end MetaMissing.bind(handler[:block], self)[match, name, *args, &block].tap do class_eval do alias_method :block_given?, :orig_block_given? remove_method :orig_block_given? end end else instance_exec(match, name, *args, &handler[:block]) end else super end end