module SetBuilder::Modifier

Public Class Methods

[](klass_or_symbol) click to toggle source
# File lib/set_builder/modifier.rb, line 36
def self.[](klass_or_symbol)
  klass_or_symbol.is_a?(Class) ? SetBuilder::Modifier.valid_modifier!(klass_or_symbol) : SetBuilder::Modifier.for(klass_or_symbol)
end
for(type) click to toggle source
# File lib/set_builder/modifier.rb, line 29
def self.for(type)
  type = get_type(type)
  @registered_modifiers[type] || raise(ArgumentError, "A modifier has not been registered for #{type}")
end
name(klass) click to toggle source
# File lib/set_builder/modifier.rb, line 20
def self.name(klass)
  @registered_modifiers.each do |key, value|
    return key if (value == klass)
  end
  klass.name
end
register(*args) click to toggle source

Usage

register(type, modifier)
register([type, modifier], [type, modifier])
register(type, modifier, type, modifier)
# File lib/set_builder/modifier.rb, line 48
def self.register(*args)
  args, i = args.flatten, 0
  while args[i+1]
    type, modifier_klass = get_type(args[i]), args[i+1]
    valid_modifier!(modifier_klass) # || raise(ArgumentError, "#{modifier_klass} is not a valid modifier")
    @registered_modifiers[type] = modifier_klass
    i += 2
  end
end
registered?(klass) click to toggle source
# File lib/set_builder/modifier.rb, line 14
def self.registered?(klass)
  @registered_modifiers.values.member?(klass)
end
valid_modifier!(klass) click to toggle source
# File lib/set_builder/modifier.rb, line 60
def self.valid_modifier!(klass)
  raise(ArgumentError, "#{klass} must inherit from either `SetBuilder::Modifier::Verb` or `SetBuilder::Modifier::Adverb`") unless (is_subclass_of?(klass, SetBuilder::Modifier::Adverb) or is_subclass_of?(klass, SetBuilder::Modifier::Verb))
  raise(ArgumentError, "#{klass} must respond to `operators`") unless klass.respond_to?(:operators)
  raise(ArgumentError, "#{klass}.operators must not be empty") if klass.operators.empty?
  klass
end

Private Class Methods

get_type(type) click to toggle source
# File lib/set_builder/modifier.rb, line 73
def self.get_type(type)
  if type.is_a?(Symbol)
    type
  else
    type.to_s.downcase.to_sym
  end
end
is_subclass_of?(klass, superklass) click to toggle source
# File lib/set_builder/modifier.rb, line 83
def self.is_subclass_of?(klass, superklass)
  sc = klass
  while (sc = sc.superclass)
    return true if (sc == superklass)
  end
  false
end