module Tablesalt::ThreadAccessor::ClassMethods

Private Instance Methods

thread_accessor(method, thread_key, **options) click to toggle source

Defines instance methods and singleton methods to read/write a given key in Thread.current

@example

class SomeClass
  include Tablesalt::ThreadAccessor

  thread_accessor :current_foo, :foo, private: false
end

SomeClass.current_foo = "bar"
SomeClass.current_foo
=> "bar"

SomeClass.new.current_foo = "baz"
SomeClass.new.current_foo
=> "baz"

Thread.current[:foo]
=> "baz"

@param method [String, Symbol] The name of the writer method @param thread_key [String, Symbol] The key to write to on Thread.current @option :private [Boolean] If true, all defined methods will be private. Default: true

# File lib/tablesalt/thread_accessor.rb, line 141
def thread_accessor(method, thread_key, **options)
  thread_reader(method, thread_key, **options)
  thread_writer(method, thread_key, **options)
end
thread_reader(method, thread_key, **options) click to toggle source

Defines an instance method and a singleton method to read from a given key in Thread.current

@example

class SomeClass
  include Tablesalt::ThreadAccessor

  thread_reader :current_foo, :foo, private: false
end

Thread.current[:foo] = "bar"
SomeClass.current_foo
=> "bar"

SomeClass.new.current_foo
=> "bar"

@param method [String, Symbol] The name of the reader method @param thread_key [String, Symbol] The key to read from Thread.current @option :private [Boolean] If true, both defined methods will be private. Default: true

# File lib/tablesalt/thread_accessor.rb, line 68
def thread_reader(method, thread_key, **options)
  define_method(method) { __thread_accessor_store_instance__[thread_key] }
  define_singleton_method(method) { __thread_accessor_store_instance__[thread_key] }

  return unless options.fetch(:private, true)

  private method
  private_class_method method
end
thread_writer(method, thread_key, **options) click to toggle source

Defines an instance method and a singleton method to write to a given key in Thread.current

@example

class SomeClass
  include Tablesalt::ThreadAccessor

  thread_writer :current_foo, :foo, private: false
end

SomeClass.current_foo = "bar"

Thread.current[:foo]
=> "bar"
Note

All written thread variables are tracked on-thread, but will not be automatically cleared when the thread is done processing a request/unit of work. Make sure to either use the provided {ThreadAccessor::RackMiddleware} or run {ThreadAccessor.clean_thread_context} manually once the thread is finished to avoid pollluting other requests.

Gem Authors

Thread variables should ideally be kept in a namespaced store instead of the global one. This means you are responsible for clearing your own store - either add your own middleware or advise users how to clear the thread store themselves.

@param method [String, Symbol] The name of the writer method @param thread_key [String, Symbol] The key to write to on Thread.current @option :private [Boolean] If true, both defined methods will be private. Default: true

# File lib/tablesalt/thread_accessor.rb, line 106
def thread_writer(method, thread_key, **options)
  method_name = "#{method}="

  define_method(method_name) { |value| __thread_accessor_store_instance__[thread_key] = value }
  define_singleton_method(method_name) { |value| __thread_accessor_store_instance__[thread_key] = value }

  return unless options.fetch(:private, true)

  private method_name
  private_class_method method_name
end