module Configuru::ConfigMethods::ClassMethods

Class methods

Public Instance Methods

param(name,options={}) click to toggle source
# File lib/configuru/config_methods.rb, line 14
def param(name,options={})
  param_names << name.to_sym

  inst_var = "@#{name.to_s}"
  define_method(name) do
    if !instance_variable_defined?(inst_var) && options.has_key?(:default)
      instance_variable_set inst_var, options[:default]
    end
    instance_variable_get inst_var
  end

  define_method("#{name.to_s}=") do |value|
    if options[:lockable] && is_locked
      raise ArgumentError.new("'#{name.to_s}' cannot be set at this time")
    end
    if options[:not_nil] && value.nil?
      raise ArgumentError.new("'#{name.to_s}' cannot be nil")
    end
    if options[:not_empty] && (value.nil? || value.empty?)
      raise ArgumentError.new("'#{name.to_s}' cannot be empty")
    end
    if options.has_key?(:must_be) && !Array(options[:must_be]).include?(value.class)
      valid_class = false
      Array(options[:must_be]).each do |cname|
        valid_class = true if value.is_a?(cname)
      end
      raise ArgumentError.new("Wrong class (#{value.class}) for '#{name.to_s}' value") unless valid_class
    end
    if options.has_key?(:must_respond_to)
      Array(options[:must_respond_to]).each do |mname|
        raise ArgumentError.new("'#{name.to_s}' must respond to '#{mname}'") unless value.respond_to?(mname)
      end
    end
    value = Hash(value) if options[:make_hash]
    value = Array(value) if options[:make_array]
    value = String(value) if options[:make_string]
    value = value.to_i if options[:make_int]
    value = value.to_f if options[:make_float]
    value = !!value if options[:make_bool]
    if options.has_key?(:max) && (value > options[:max])
      raise ArgumentError.new("'#{name.to_s}' must be not more than #{options[:max]}")
    end
    if options.has_key?(:min) && (value < options[:min])
      raise ArgumentError.new("'#{name.to_s}' must be not less than #{options[:min]}")
    end
    if options.has_key?(:in) && !options[:in].include?(value)
      raise ArgumentError.new("'#{name.to_s}' is out of range")
    end
    if options.has_key?(:convert)
      if options[:convert].is_a? Symbol
        value = @__parent_object.send options[:convert], value
      else
        value = options[:convert].call( value )
      end
    end

    instance_variable_set inst_var, value
  end
  name
end
param_names() click to toggle source
# File lib/configuru/config_methods.rb, line 11
def param_names
  @param_names ||= []
end