module FiniteMachine::Threadable::ClassMethods

Public Instance Methods

attr_threadsafe(*attrs) click to toggle source

Defines threadsafe attributes for a class

@example

attr_threadable :errors, :events

@example

attr_threadable :errors, default: []

@return [nil]

@api public

# File lib/finite_machine/threadable.rb, line 56
      def attr_threadsafe(*attrs)
        opts    = attrs.last.is_a?(::Hash) ? attrs.pop : {}
        default = opts.fetch(:default, nil)
        attrs.flatten.each do |attr|
          class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
            def #{attr}(*args)
              value = args.shift
              if value
                self.#{attr} = value
              elsif instance_variables.include?(:@#{attr})
                sync_shared { @#{attr} }
              elsif #{!default.nil?}
                sync_shared { instance_variable_set(:@#{attr}, #{default}) }
              end
            end
            alias_method '#{attr}?', '#{attr}'

            def #{attr}=(value)
              sync_exclusive { @#{attr} = value }
            end
          RUBY_EVAL
        end
      end