132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/carat/multiton.rb', line 132
def self.append_features(klass)
def klass.instance(*args, &block)
k = (respond_to?(MULTITON_ID_HOOK) ? send(MULTITON_ID_HOOK, *args, &block) : args)
unless (obj = (POOLS[self] ||= {})[k])
begin
critical = Thread.critical
Thread.critical = true
meth = self.respond_to?(MULTITON_NEW_HOOK) ? MULTITON_NEW_HOOK : :new
obj = (POOLS[self][k] = self.send(meth, *args, &block))
ensure
Thread.critical = critical end
end
return obj
end
end
|