def initialize(*args)
options_from_args = args.extract_options!
@name, @type = args.shift.to_s, args.shift
self.options = (options_from_args || {}).symbolize_keys
@dynamic = !!options[:__dynamic]
@embeddable = type.respond_to?(:embeddable?) ? type.embeddable? : false
@is_id = @name == ID_STR
@typecast = @options[:typecast]
@accessors = Array(@options[:accessors]).compact.map &:to_s
@has_default = !!options.key?(:default)
self.default = self.options[:default] if default?
if abbr = @options[:abbr] || @options[:alias] || @options[:field_name]
@abbr = abbr.to_s
elsif @name.match(/^[A-Z]/) and !dynamic?
@abbr = @name
@name = @name.gsub(/^([A-Z])/) {|m| m.downcase }
Kernel.warn "Key names may not start with uppercase letters. If your field starts " +
"with an uppercase letter, use :field_name to specify the real field name. " +
"Accessors called `#{@name}` have been created instead."
end
@ivar = "@#{name}""@#{name}" if valid_ruby_name?
validate_key_name! unless dynamic? or !any_accessor?
end