Sha256: d25a33e9f77a228ec5761e0110efc9023392bb11ced527d433219dc60d59ae2d
Contents?: true
Size: 1.9 KB
Versions: 1
Compression:
Stored size: 1.9 KB
Contents
module Proxies module ProxyOwner def proxy_owner; @owner end end module ProxyRespondTo def proxy_respond_to?(method) this = self this = this # suppress a warning message !!::Kernel.eval("defined?(this.#{method})") end end class Proxy < BasicObject instance_methods.each { |m| undef_method(m) if m.to_s !~ /^__/ } # Creates a new proxy for target. You can pass a block (anonymous # module) to extend the proxy object "inline". # # ==== Options # * <tt>:owner</tt> - Optional owner object # * <tt>:extend</tt> - 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]) 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 def proxy_target defined?(@target) ? @target : @target = @lazy_target.call end def method_missing(name, *args, &block) proxy_target.send(name, *args, &block) end def respond_to?(name, include_private = false) proxy_target.respond_to?(name, include_private) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
proxies-0.2.3 | lib/proxies/proxy.rb |