Module: Multiton::MetaMethods
- Includes:
- Inclusive
- Defined in:
- lib/standard/facets/multiton.rb
Instance Method Summary collapse
- #_load(str) ⇒ Object protected
- #initialized?(*e, &b) ⇒ Boolean
- #instance(*e, &b) ⇒ Object (also: #new)
-
#multiton_id(*e, &b) ⇒ Object
private
Default method to to create a key to cache already constructed instances.
- #multiton_instance ⇒ Object protected
- #multiton_mutex ⇒ Object protected
- #reinitialize ⇒ Object protected
- #singleton_method_added(sym) ⇒ Object private
Methods included from Inclusive
Instance Method Details
#_load(str) ⇒ Object (protected)
249 250 251 |
# File 'lib/standard/facets/multiton.rb', line 249 def _load(str) instance(*Marshal.load(str)) end |
#initialized?(*e, &b) ⇒ Boolean
230 231 232 |
# File 'lib/standard/facets/multiton.rb', line 230 def initialized?(*e, &b) multiton_instance.key?(multiton_id(*e, &b)) end |
#instance(*e, &b) ⇒ Object Also known as: new
215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/standard/facets/multiton.rb', line 215 def instance(*e, &b) arg = multiton_id(*e, &b) multiton_instance.fetch(arg) do multiton_mutex[arg].synchronize do multiton_instance.fetch(arg) do val = multiton_instance[arg] = new!(*e, &b) #new(*e, &b) val.instance_variable_set(:@multiton_initializer, e, &b) multiton_mutex.initialized(arg) val end end end end |
#multiton_id(*e, &b) ⇒ Object (private)
Default method to to create a key to cache already constructed instances. In the use case MultitonClass.new(e), MultiClass.new(f) must be semantically equal if multiton_id(e).eql?(multiton_id(f)) evaluates to true.
259 260 261 |
# File 'lib/standard/facets/multiton.rb', line 259 def multiton_id(*e, &b) e end |
#multiton_instance ⇒ Object (protected)
236 237 238 |
# File 'lib/standard/facets/multiton.rb', line 236 def multiton_instance @multiton_instance ||= Hash.new end |
#multiton_mutex ⇒ Object (protected)
240 241 242 |
# File 'lib/standard/facets/multiton.rb', line 240 def multiton_mutex @multiton_mutex ||= InstanceMutex.new end |
#reinitialize ⇒ Object (protected)
244 245 246 247 |
# File 'lib/standard/facets/multiton.rb', line 244 def reinitialize multiton_instance.clear multiton_mutex.clear end |
#singleton_method_added(sym) ⇒ Object (private)
263 264 265 266 267 268 |
# File 'lib/standard/facets/multiton.rb', line 263 def singleton_method_added(sym) super if (sym == :marshal_dump) & singleton_methods.include?('marshal_dump') raise TypeError, "Don't use marshal_dump - rely on _dump and _load instead" end end |