Sha256: d04c287dc9f5ecd51c7539a7b493c94d0cf2f4cedd22a3b5c43c834bea37fe5b

Contents?: true

Size: 1.35 KB

Versions: 7

Compression:

Stored size: 1.35 KB

Contents

require "delegate"

def DelegateClass(superclass)
  klass = Class.new
  methods = superclass.public_instance_methods(true)
  methods -= ::Kernel.public_instance_methods(false)
  methods -= %w[
    __verify_metaclass__
    copy_from
    singleton_class
    to_marshal
  ]
  methods |= ["to_s","to_a","inspect","==","=~","==="]

  klass.module_eval do
    def initialize(obj)  # :nodoc:
      @_dc_obj = obj
    end

    def method_missing(m, *args)  # :nodoc:
      unless @_dc_obj.respond_to?(m)
        super(m, *args)
      end
      @_dc_obj.__send__(m, *args)
    end

    def respond_to?(m, include_private=false)  # :nodoc:
      return true if super
      return @_dc_obj.respond_to?(m, include_private)
    end

    def __getobj__  # :nodoc:
      @_dc_obj
    end

    def __setobj__(obj)  # :nodoc:
      raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
      @_dc_obj = obj
    end

    def clone  # :nodoc:
      new = super
      new.__setobj__(__getobj__.clone)
      new
    end

    def dup  # :nodoc:
      new = super
      new.__setobj__(__getobj__.dup)
      new
    end
  end

  methods.each do |method|
    begin
      klass.__send__(:define_method, method) do |*args, &block|
        @_dc_obj.__send__(method, *args, &block)
      end
    rescue SyntaxError
      raise NameError, "invalid identifier #{method}"
    end
  end
  return klass
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
fancy-0.10.0 boot/fancy_ext/delegator.rb
fancy-0.9.0 boot/fancy_ext/delegator.rb
fancy-0.8.0 boot/fancy_ext/delegator.rb
fancy-0.7.0 boot/fancy_ext/delegator.rb
fancy-0.6.0 boot/fancy_ext/delegator.rb
fancy-0.5.0 boot/fancy_ext/delegator.rb
fancy-0.4.0 boot/fancy_ext/delegator.rb