module Garcon::Dereferenceable

Object references in Ruby are mutable. This can lead to serious problems when the ‘#value` of a concurrent object is a mutable reference. Which is always the case unless the value is a `Fixnum`, `Symbol`, or similar “primitive” data type. Most classes in this library that expose a `#value` getter method do so using the `Dereferenceable` mixin module.

Objects with this mixin can be configured with a few options that can help protect the program from potentially dangerous operations.

Public Instance Methods

deref()
Alias for: value
value() click to toggle source

Return the value this object represents after applying the options specified by the ‘#set_deref_options` method.

When multiple deref options are set the order of operations is strictly defined. The order of deref operations is:

  • ‘:copy_on_deref`

  • ‘:dup_on_deref`

  • ‘:freeze_on_deref`

Because of this ordering there is no need to ‘#freeze` an object created by a provided `:copy_on_deref` block. Simply set `:freeze_on_deref` to `true`. Setting both `:dup_on_deref` to `true` and `:freeze_on_deref` to `true` is as close to the behavior of a “pure” functional language as we are likely to get in Ruby.

This method is thread-safe and synchronized with the internal ‘#mutex`.

@return [Object]

the current value of the object
# File lib/garcon/task/dereferenceable.rb, line 62
def value
  mutex.lock
  apply_deref_options(@value)
ensure
  mutex.unlock
end
Also aliased as: deref