Class: DeepConnect::ClassSpecSpace
- Defined in:
- lib/deep-connect/class-spec-space.rb
Constant Summary collapse
- NULL =
:NULL
Instance Method Summary collapse
- #class_spec_ancestors(csid, &block) ⇒ Object
- #class_spec_id_of(obj) ⇒ Object
- #class_specs ⇒ Object
- #class_specs=(cspecs) ⇒ Object
- #def_interface(klass, method) ⇒ Object
- #def_method_spec(klass, *method_spec) ⇒ Object
- #def_single_interface(obj, method) ⇒ Object
- #def_single_method_spec(obj, method_spec) ⇒ Object
-
#initialize(remote = :remote) ⇒ ClassSpecSpace
constructor
A new instance of ClassSpecSpace.
- #method_spec(ref_or_obj, method) ⇒ Object
Constructor Details
#initialize(remote = :remote) ⇒ ClassSpecSpace
Returns a new instance of ClassSpecSpace.
16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/deep-connect/class-spec-space.rb', line 16 def initialize(remote = :remote) case remote when :remote @class_specs = nil when :local @class_specs = {} end @class_specs_mutex = Mutex.new @class_specs_cv = ConditionVariable.new @method_spec_cache = {} end |
Instance Method Details
#class_spec_ancestors(csid, &block) ⇒ Object
127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/deep-connect/class-spec-space.rb', line 127 def class_spec_ancestors(csid, &block) @class_specs_mutex.synchronize do while !@class_specs @class_specs_cv.wait(@class_specs_mutex) end end class_spec = @class_specs[csid] class_spec.ancestors.select{|anc| @class_specs[anc]}.each{|anc| yield @class_specs[anc] } end |
#class_spec_id_of(obj) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/deep-connect/class-spec-space.rb', line 30 def class_spec_id_of(obj) ancestors = obj.class.ancestors begin single = (class<<obj;self;end) ancestors.unshift single rescue end #p ancestors # p ancestors.collect{|e| e.object_id} klass = ancestors.find{|kls| @class_specs[kls.object_id] } if klass klass.object_id else nil end end |
#class_specs ⇒ Object
118 119 120 121 122 123 124 125 |
# File 'lib/deep-connect/class-spec-space.rb', line 118 def class_specs @class_specs_mutex.synchronize do while !@class_specs @class_specs_cv.wait(@class_specs_mutex) end @class_specs end end |
#class_specs=(cspecs) ⇒ Object
111 112 113 114 115 116 |
# File 'lib/deep-connect/class-spec-space.rb', line 111 def class_specs=(cspecs) @class_specs_mutex.synchronize do @class_specs = cspecs @class_specs_cv.broadcast end end |
#def_interface(klass, method) ⇒ Object
99 100 101 102 103 104 |
# File 'lib/deep-connect/class-spec-space.rb', line 99 def def_interface(klass, method) mspec = MethodSpec.new mspec.method = method mspec.interface = true def_method_spec(klass, mspec) end |
#def_method_spec(klass, *method_spec) ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/deep-connect/class-spec-space.rb', line 79 def def_method_spec(klass, *method_spec) csid = klass.object_id unless cspec = @class_specs[csid] cspec = ClassSpec.new(klass) @class_specs[csid] = cspec end if method_spec.size == 1 and method_spec.first.kind_of?(MethodSpec) mspec = method_spec.first else mspec = MethodSpec.spec(*method_spec) end cspec.add_method_spec(mspec) end |
#def_single_interface(obj, method) ⇒ Object
106 107 108 109 |
# File 'lib/deep-connect/class-spec-space.rb', line 106 def def_single_interface(obj, method) klass = class<<obj;self;end def_interface(klass, method) end |
#def_single_method_spec(obj, method_spec) ⇒ Object
94 95 96 97 |
# File 'lib/deep-connect/class-spec-space.rb', line 94 def def_single_method_spec(obj, method_spec) klass = class<<obj;self;end def_method_spec(klass, method_spec) end |
#method_spec(ref_or_obj, method) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/deep-connect/class-spec-space.rb', line 49 def method_spec(ref_or_obj, method) puts "method_spec(#{ref_or_obj}, #{method})" if Conf.DISPLAY_METHOD_SPEC if ref_or_obj.__deep_connect_reference? csid = ref_or_obj.csid else csid = class_spec_id_of(ref_or_obj) end return nil unless csid # mid = [csid, method] # mid = sprintf("%X-%s", csid, method) mid = "#{csid}-#{method}" case mspec = @method_spec_cache[mid] when nil # pass when NULL return nil else return mspec end class_spec_ancestors(csid) do |cspec| if mspec = cspec.method_spec(method) return mspec end end @method_spec_cache[mid] = NULL return nil end |