# File lib/attributes.rb, line 26
  def attributes *a, &b
    unless a.empty?
      returned = Hash.new

      hashes, names = a.partition{|x| Hash === x}
      names_and_defaults = {}
      hashes.each{|h| names_and_defaults.update h}
      names.flatten.compact.each{|name| names_and_defaults.update name => nil}

      initializers = __attributes__.initializers

      names_and_defaults.each do |name, default|
        raise NameError, "bad instance variable name '@#{ name }'" if "@#{ name }" =~ %r/[!?=]$/o
        name = name.to_s

        initialize = b || lambda { default }
        initializer = lambda do |this|
          Object.instance_method('instance_eval').bind(this).call &initialize
        end
        initializer_id = initializer.object_id
        __attributes__.initializers[name] = initializer

        module_eval "def \#{ name }=(*value, &block)\nvalue.unshift block if block\n@\#{ name } = value.first\nend\n"

        module_eval "def \#{ name }(*value, &block)\nvalue.unshift block if block\nreturn self.send('\#{ name }=', value.first) unless value.empty?\n\#{ name }! unless defined? @\#{ name }\n@\#{ name }\nend\n"

        module_eval "def \#{ name }!\ninitializer = ObjectSpace._id2ref \#{ initializer_id }\nself.\#{ name } = initializer.call(self)\n@\#{ name }\nend\n"

        module_eval "def \#{ name }?\n\#{ name }\nend\n"

        attributes << name
        returned[name] = initializer 
      end

      returned
    else
      begin
        __attribute_list__
      rescue NameError
        singleton_class =
          class << self
            self
          end
        klass = self
        singleton_class.module_eval do
          attribute_list = List.new 
          define_method('attribute_list'){ klass == self ? attribute_list : raise(NameError) }
          alias_method '__attribute_list__', 'attribute_list'
        end
        __attribute_list__
      end
    end
  end