Sha256: c12128ee9a8a6cc7f0aad93646dd11b56b6001134ea45506f12ffac30822d269

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

module SerialPreference
  class Preferenzer
    PreferenceGroup = Struct.new(:name,:preferences)

    attr_reader :preference_groups, :current_group

    def initialize
      @preference_names_cache = HashWithIndifferentAccess.new
      @preference_groups = []
      @definition = false
      activate_group
    end

    def draw(&block)
      @defintion = true
      instance_exec(&block)
      @defintion = false
    end

    def respond_to?(name)
      [:string, :integer, :boolean, :float].include?(name) || @preference_names_cache[name].present? || super
    end

    def method_missing(name,*args,&block)
      if @defintion
        preference(name,args.extract_options!)
      else
        super
      end
    end

    [:string,:integer,:boolean,:float].each do |dt|
      define_method(dt) do |name,opts = {}|
        preference(name,opts.merge!(:data_type => dt))
      end
    end

    def preference(name,opts = {})
      Array(name).each do |n|
        push_preference SerialPreference::PreferenceDefinition.new(n.to_sym,opts)
      end
    end
    alias :pref :preference

    def preference_group(name,&block)
      activate_group(name)
      instance_exec(&block)
    end

    def all_preference_definitions
      preference_groups.map{|x|x.preferences.values}.flatten
    end

    def all_preference_names
      @preference_names_cache.keys
    end

    def all_groups
      @preference_groups.map{|x|x.name}
    end

    private

    def activate_group(group_name = :base)
      @current_group = find_or_create_group(group_name)
    end

    def push_preference(preference)
      @preference_names_cache[preference.name] = 1
      @current_group.preferences[preference.name] = preference
    end

    def find_or_create_group(name)
      find_group(name) || create_group(name)
    end

    def find_group(name)
      @preference_groups.find{|x|x.name == name}
    end

    def create_group(name = :base)
      PreferenceGroup.new(name,{}).tap do |pg|
        @preference_groups.push(pg)
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
serial_preference-1.0.1 lib/serial_preference/preferenzer.rb