def param(name, type = nil, **opts, &block)
      add_definition(false, name, type, block, opts)
    end
def param(name, type = nil, **opts, &block)
      add_definition(false, name, type, block, opts)
    end
Adds or redefines a parameter
 @param  [Symbol]       name
 @param  [#call, nil]   type (nil)
 @option opts [Proc]    :default
 @option opts [Boolean] :optional
 @option opts [Symbol]  :as
 @option opts [true, false, :protected, :public, :private] :reader
 @return [self] itself