Class: DeepConnect::ClassSpecSpace

Inherits:
Object
  • Object
show all
Defined in:
lib/deep-connect/class-spec-space.rb

Constant Summary collapse

NULL =
:NULL

Instance Method Summary collapse

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_specsObject



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