Description

A cool proxy implementation pattern in ruby

Install

sudo gem install proxy_machine

Example usage

The awesome way:

p = proxy_for [1, 2, 3]
p.reverse => [3, 2, 1]

p = proxy_for [1, 2, 3], :before => {
  :reverse => lambda {|obj| puts 'before reverse'}
}   

p.reverse => before reverse
             [3, 2, 1]

How to detect that the object is a proxy?

The beautiful way

o1 = [1, 2, 3]
o1.proxied? => false

o2 = proxy_for [1, 2, 3] 
o2.proxied? => true

Other way

p = proxy_for [1, 2, 3]
defined? p.proxied_class?

Trying it in irb

irb
require 'proxy_machine'
proxy_for...

Other ways:

1º - Creates a proxy for the informed object

p = Proxy.new [1,2,3]
p.size => 3

2º - A proxy with a before callback.

p = Proxy.new [1,2,3], :before => {
  :size => lambda {|obj| puts "before: #{obj.inspect}"}
}

p.size => before: [1, 2, 3]
          3

3º - A proxy with a after callback

p = Proxy.new [1,2,3], :after => {
  :size => lambda {|obj, result| puts "after: #{obj.inspect}: result => #{result}"}
}

p.size => after: [1, 2, 3]: result => 3
          3

4º - Both

p = Proxy.new [1,2,3], 
              :before => {
                :size => lambda {|obj| puts "before: #{obj.inspect}"}
              }, :after => {
                :size => lambda {|obj, result| puts "after: #{obj.inspect}: result => #{result}"}
              }