class Upcastable::UpcastedObject

Public Class Methods

define_delegate_method(m) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 3
def self.define_delegate_method(m)
  define_method(m) do |*args, &block|
    @object.send(m, *args, &block)
  end
end
new(object, ancestor, base = object.class) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 9
def initialize(object, ancestor, base = object.class)
  unless base <= ancestor
    raise ArgumentError, "#{ancestor} is not an ancestor of #{base}"
  end
  @object   = object
  @ancestor = ancestor
end

Public Instance Methods

downcast() click to toggle source
# File lib/upcastable/upcasted_object.rb, line 53
def downcast
  @object
end
initialize_clone(other) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 21
def initialize_clone(other)
  @object = @object.clone
end
method_missing(m, *args, &block) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 57
def method_missing(m, *args, &block)
  unless @ancestor.method_defined?(m)
    raise NoMethodError, "`#{m}' is not defined in #{@ancestor}"
  end
  @object.send(m, *args, &block)
end
respond_to?(m, private = false) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 32
def respond_to?(m, private = false)
  if private
    @ancestor.private_method_defined?(m) || @ancestor.method_defined?(m)
  else
    @ancestor.method_defined?(m)
  end
end
send(m, *args, &block) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 25
def send(m, *args, &block)
  unless @ancestor.method_defined?(m) && @ancestor.private_method_defined?(m)
    raise NoMethodError, "`#{m}' is not defined in #{@ancestor}"
  end
  @object.send(m, *args, &block)
end
upcast_to(ancestor) click to toggle source
# File lib/upcastable/upcasted_object.rb, line 40
def upcast_to(ancestor)
  return self if ancestor == @ancestor
  UpcastedObject.new(@object, ancestor, @ancestor)
end
upcasted?() click to toggle source
# File lib/upcastable/upcasted_object.rb, line 49
def upcasted?
  true
end
upcasting() click to toggle source
# File lib/upcastable/upcasted_object.rb, line 45
def upcasting
  @ancestor
end