Skip to content

Commit

Permalink
Initial delegate (stdlib) implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
adambeynon committed Sep 20, 2013
1 parent a74ba83 commit fc58796
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
34 changes: 34 additions & 0 deletions spec/rubyspec/library/delegate/delegator/send_spec.rb
@@ -0,0 +1,34 @@
require File.expand_path('../../../../spec_helper', __FILE__)
require File.expand_path('../../fixtures/classes', __FILE__)

describe "SimpleDelegator.new" do
before :all do
@simple = DelegateSpecs::Simple.new
@delegate = SimpleDelegator.new(@simple)
end

it "forwards public method calls" do
@delegate.pub.should == :foo
end

ruby_version_is ""..."2.0" do
it "forwards protected method calls" do
@delegate.prot.should == :protected
end
end

ruby_version_is "2.0" do
it "forwards protected method calls" do
lambda{ @delegate.prot }.should raise_error( NoMethodError )
end
end

it "doesn't forward private method calls" do
lambda{ @delegate.priv }.should raise_error( NoMethodError )
end

it "doesn't forward private method calls even via send or __send__" do
lambda{ @delegate.send(:priv, 42) }.should raise_error( NoMethodError )
lambda{ @delegate.__send__(:priv, 42) }.should raise_error( NoMethodError )
end
end
13 changes: 13 additions & 0 deletions spec/rubyspec/library/delegate/fixtures/classes.rb
@@ -0,0 +1,13 @@
require 'delegate'
module DelegateSpecs
class Simple
def pub
:foo
end

def respond_to_missing?(method, priv=false)
method == :pub_too ||
(priv && method == :priv_too)
end
end
end
25 changes: 25 additions & 0 deletions stdlib/delegate.rb
@@ -0,0 +1,25 @@
class Delegator < BasicObject
def initialize(obj)
__setobj__(obj)
end

def method_missing(m, *args, &block)
target = self.__getobj__

if target.respond_to?(m)
target.__send__(m, *args, &block)
else
super(m, *args, &block)
end
end
end

class SimpleDelegator < Delegator
def __getobj__
@delegate_sd_obj
end

def __setobj__(obj)
@delegate_sd_obj = obj
end
end

0 comments on commit fc58796

Please sign in to comment.