lib/celluloid/proxy/abstract.rb in celluloid-0.17.2 vs lib/celluloid/proxy/abstract.rb in celluloid-0.17.3

- old
+ new

@@ -1,19 +1,50 @@ -# Base class of Celluloid proxies -class Celluloid::Proxy::Abstract < BasicObject - # Used for reflecting on proxy objects themselves - def __class__ - ::Celluloid::Proxy::Abstract +module Celluloid::Proxy + # Looks up the actual class of instance, even if instance is a proxy. + def self.class_of(instance) + (class << instance; self; end).superclass end +end +# Base class of Celluloid proxies +class Celluloid::Proxy::Abstract < BasicObject # Needed for storing proxies in data structures - needed = [:object_id, :__id__, :hash, :private_methods] - instance_methods + needed = [:object_id, :__id__, :hash, :eql?, :private_methods] - instance_methods if needed.any? include ::Kernel.dup.module_eval { undef_method(*(instance_methods - needed)) self } # rubinius bug? These methods disappear when we include hacked kernel define_method :==, ::BasicObject.instance_method(:==) unless instance_methods.include?(:==) alias_method(:equal?, :==) unless instance_methods.include?(:equal?) + end + + def __class__ + @class ||= ::Celluloid::Proxy.class_of(self) + end +end + +class Celluloid::Proxy::AbstractCall < Celluloid::Proxy::Abstract + attr_reader :mailbox + + def initialize(mailbox, klass) + @mailbox = mailbox + @klass = klass + end + + def eql?(other) + self.__class__.eql?(::Celluloid::Proxy.class_of(other)) and @mailbox.eql?(other.mailbox) + end + + def hash + @mailbox.hash + end + + def __klass__ + @klass + end + + def inspect + "#<#{self.__class__}(#{@klass})>" end end