class Main::Parameter

Constants

Types

Public Class Methods

class_for(type) click to toggle source
# File lib/main/parameter.rb, line 41
def class_for(type)
  sym = type.to_s.downcase.to_sym
  c = Types.detect{|t| t.sym == sym}
  raise ArgumentError, type.inspect unless c
  c
end
create(type, main, *a, &b) click to toggle source
# File lib/main/parameter.rb, line 48
def create(type, main, *a, &b)
  c = class_for(type)
  obj = c.allocate
  obj.type = c.sym
  obj.main = main
  obj.instance_eval{ initialize(*a, &b) }
  obj
end
inherited(other) click to toggle source
# File lib/main/parameter.rb, line 33
def inherited other
  Types << other
end
new(name, *names, &block) click to toggle source
# File lib/main/parameter.rb, line 79
def initialize(name, *names, &block)
  @names = Cast.list_of_string(name, *names)

  @names.map! do |name|
    if name =~ /^-+/
      name.gsub! /^-+/, ''
    end

    if name =~ /=.*$/
      argument( name =~ /=\s*\[.*$/ ? :optional : :required )
      name.gsub! /=.*$/, ''
    end

    name
  end
  @names = @names.sort_by{|name| name.size}.reverse
  @names[1..-1].each do |name|
    raise ArgumentError, "only one long name allowed (#{ @names.inspect })" if
      name.size > 1
  end

  DSL.evaluate(self, &block) if block
  sanity_check!
end
sym() click to toggle source
# File lib/main/parameter.rb, line 37
def sym
  @sym ||= name.split(/::/).last.downcase.to_sym
end
wrap_errors() { || ... } click to toggle source
# File lib/main/parameter.rb, line 24
def wrap_errors
  begin
    yield
  rescue => e
    raise wrapped_error(e)
  end
end
wrapped_error(w) click to toggle source
# File lib/main/parameter.rb, line 17
def wrapped_error w
  e = Error.new "(#{ w.message } (#{ w.class }))"
  e.wrapped = w
  e.set_backtrace(w.backtrace || [])
  e
end

Public Instance Methods

add_handlers(e) click to toggle source
# File lib/main/parameter.rb, line 225
def add_handlers e
  esc = 
    class << e
      self
    end

  this = self

  %w[ before instead after ].each do |which|
    getter = "error_handler_#{ which }"
    query = "error_handler_#{ which }?"
    if send(query)
      handler = send getter 
      esc.module_eval do
        define_method(getter) do |main|
          main.instance_eval_block self, &handler
        end
      end
    end
  end
end
add_value(value) click to toggle source
# File lib/main/parameter.rb, line 126
def add_value value
  given true
  values << value
end
adding_handlers() { || ... } click to toggle source
# File lib/main/parameter.rb, line 247
def adding_handlers
  begin
    yield
  rescue Exception => e
    add_handlers e
    raise
  end
end
apply_casting() click to toggle source
# File lib/main/parameter.rb, line 201
def apply_casting 
  if cast?
    op = cast.respond_to?('call') ? cast : Cast[cast]
    case op.arity
      when -1
        replacement = Parameter.wrap_errors{ op.call(*values) }
        values.replace(replacement)
      else
        values.map! do |val|
          Parameter.wrap_errors{ op.call val }
        end
    end
  end
end
argument_none?() click to toggle source
# File lib/main/parameter.rb, line 135
def argument_none?
  argument.nil?
end
argument_optional?() click to toggle source
# File lib/main/parameter.rb, line 143
def argument_optional?
  argument and
    argument.to_s.downcase.to_sym == :optional
end
argument_required?() click to toggle source
# File lib/main/parameter.rb, line 139
def argument_required?
  argument and 
    argument.to_s.downcase.to_sym == :required
end
check_arity() click to toggle source
# File lib/main/parameter.rb, line 175
def check_arity 
  return true if not given? and optional?

  ex = values.size == 0 ? NotGiven : Arity

  (raise ex, "#{ typename })" if values.size.zero? and argument_required?) unless arity == -1

  if arity >= 0
    min = arity
    sign = ''
  else
    min = arity.abs - 1
    sign = '-'
  end

  arity = min

  if values.size < arity
    if argument_optional?
      raise ex, "#{ typename }) #{ values.size }/#{ sign }#{ arity }" if(values.size < arity and values.size > 0)
    elsif argument_required? or argument_none?
      raise ex, "#{ typename }) #{ values.size }/#{ sign }#{ arity }" if(values.size < arity)
    end
  end
end
check_validation() click to toggle source
# File lib/main/parameter.rb, line 216
def check_validation 
  if validate?
    values.each do |value|
      validate[value] or 
        raise InValid, "invalid: #{ typename }=#{ value.inspect }"
    end
  end
end
default(*values) click to toggle source
# File lib/main/parameter.rb, line 112
def default(*values)
  defaults(values) unless values.empty?
  defaults.first
end
default=(value) click to toggle source
# File lib/main/parameter.rb, line 117
def default=(value)
  default(value)
end
name() click to toggle source
# File lib/main/parameter.rb, line 108
def name
  names.first
end
optional=(bool) click to toggle source
# File lib/main/parameter.rb, line 151
def optional= bool 
  self.required !bool
end
optional?() click to toggle source
# File lib/main/parameter.rb, line 148
def optional?
  not required?
end
remove() click to toggle source
# File lib/main/parameter.rb, line 256
def remove
  main.parameters.delete(self)
end
sanity_check!() click to toggle source
# File lib/main/parameter.rb, line 104
def sanity_check!
  raise Arity, "#{ name } with arity -1 (zero or more args) cannot be required" if(arity == -1 and required?)
end
setup!() click to toggle source

def setup!

return false unless given?
adding_handlers do
  check_arity
  apply_casting
  check_validation
end
true

end

# File lib/main/parameter.rb, line 167
def setup!
  adding_handlers do
    check_arity
    apply_casting
    check_validation
  end
end
typename() click to toggle source
# File lib/main/parameter.rb, line 121
def typename
  prefix = '--' if type.to_s =~ /option/
  "#{ type }(#{ prefix }#{ name })"
end
value() click to toggle source
# File lib/main/parameter.rb, line 131
def value
  values.first
end