class Proxies::Proxy

Public Class Methods

new(lazy_target, options = {}, &block) click to toggle source

Creates a new proxy for target. You can pass a block (anonymous module) to extend the proxy object “inline”.

Options

  • :owner - Optional owner object

  • :extend - Module or array of modules used to extend

  • the newly created proxy object

Examples

Proxy.new(lambda { [1, 2, 3] }) do
  def extension_method
    proxy_target.length * 500
  end
end

Proxy.new(lambda { my_method }, extend: MyExtension) do
  def add_owner_and_target_values
    proxy_target.value + proxy_owner.value
  end
end

Proxy.new(lambda { my_method }, owner: self) do
  def do_something
    ...
  end
end

Proxy.new(lambda { something }, extend: [FirstExtension, SecondExtension])
# File lib/proxies/proxy.rb, line 46
def initialize(lazy_target, options = {}, &block)
  @lazy_target = lazy_target
  @owner = options[:owner] if options.key?(:owner)

  extends = ::Kernel.Array(options[:extend])
  extends << ::Module.new(&block)
  extends << ::Proxies::ProxyOwner if defined?(@owner)
  extends << ::Proxies::ProxyRespondTo
  extends.each { |m| m.send(:extend_object, self) }
end

Public Instance Methods

method_missing(name, *args, &block) click to toggle source
# File lib/proxies/proxy.rb, line 61
def method_missing(name, *args, &block)
  proxy_target.send(name, *args, &block)
end
proxy_target() click to toggle source
# File lib/proxies/proxy.rb, line 57
def proxy_target
  defined?(@target) ? @target : @target = @lazy_target.call
end
respond_to?(name, include_private = false) click to toggle source
# File lib/proxies/proxy.rb, line 65
def respond_to?(name, include_private = false)
  proxy_target.respond_to?(name, include_private)
end