Sha256: e25c4163e8c0bb3e98209041e550af9f928cef8478132c06a90e612e8224246c

Contents?: true

Size: 1.95 KB

Versions: 15

Compression:

Stored size: 1.95 KB

Contents

module Ramaze
  class State
    def initialize
      @core = detect
    end

    def detect
      require 'fiber'
      @extract = :resume
      Ramaze::Fiber
    rescue LoadError
      @extract = :value
      ::Thread
    end

    def [](key)
      @core.current[key]
    end

    def []=(key, value)
      @core.current[key] = value
    end

    def key?(key)
      @core.current.key?(key)
    end

    def wrap(&block)
      @core.new(&block).send(@extract)
    end
  end

  module StateAccessor

    # Iterate over the names and yield accordingly.
    # names are either objects responding to #to_sym or hashes.
    #
    # It's only used within this module for abstractin-purposes.
    # Usage below.
    def self.each(*names)
      names.each do |name|
        if name.respond_to?(:to_hash)
          name.to_hash.each do |key, meth|
            key, meth = key.to_sym, meth.to_sym
            yield key, meth
          end
        else
          key = meth = name.to_sym
          yield key, meth
        end
      end
    end

    # state_writer and state_reader, initializer is a block that may be given
    # and its result will be the new value in case the reader was never called
    # before or the value wasn't set before.
    def state_accessor(*names, &initializer)
      state_writer(*names)
      state_reader(*names, &initializer)
    end

    # Simple writer accessor to STATE[key]=
    def state_writer(*names)
      StateAccessor.each(*names) do |key, meth|
        define_method("#{meth}="){|obj| STATE[key] = obj }
      end
    end

    # Reader accessor for STATE[key]
    def state_reader(*names, &initializer)
      StateAccessor.each(*names) do |key, meth|
        if initializer
          define_method(meth) do
            unless STATE.key?(key)
              STATE[key] = instance_eval(&initializer)
            else
              STATE[key]
            end
          end
        else
          define_method(meth){ STATE[key] }
        end
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 4 rubygems

Version Path
Pistos-ramaze-2008.09 lib/ramaze/snippets/ramaze/state.rb
Pistos-ramaze-2008.12 lib/ramaze/snippets/ramaze/state.rb
Pistos-ramaze-2009.01 lib/ramaze/snippets/ramaze/state.rb
Pistos-ramaze-2009.02 lib/ramaze/snippets/ramaze/state.rb
manveru-ramaze-2008.08 lib/ramaze/snippets/ramaze/state.rb
manveru-ramaze-2008.09 lib/ramaze/snippets/ramaze/state.rb
manveru-ramaze-2008.10 lib/ramaze/snippets/ramaze/state.rb
manveru-ramaze-2008.12 lib/ramaze/snippets/ramaze/state.rb
manveru-ramaze-2009.01 lib/ramaze/snippets/ramaze/state.rb
ptomato-ramaze-2009.02.1 lib/ramaze/snippets/ramaze/state.rb
ptomato-ramaze-2009.02 lib/ramaze/snippets/ramaze/state.rb
ramaze-2008.11 lib/ramaze/snippets/ramaze/state.rb
ramaze-2009.01 lib/ramaze/snippets/ramaze/state.rb
ramaze-2009.03 lib/ramaze/snippets/ramaze/state.rb
ramaze-2009.02 lib/ramaze/snippets/ramaze/state.rb