class Object
  # Metaid == a few simple metaclass helper
  # (See http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html.)
  # The hidden singleton lurks behind everyone
  def metaclass() class << self; self end end
  def meta_eval(&blk) metaclass.instance_eval(&blk) end

  # Adds methods to a metaclass
  def meta_def(name, &blk)
    meta_eval { define_method(name, &blk) }
  end

  # Defines an instance method within a class
  def class_def(name, &blk)
    class_eval { define_method(name, &blk) }
  end
  
  ##
  # if ''.not.blank?
  # http://blog.jayfields.com/2007/08/ruby-adding-not-method-for-readability.html
  define_method :not do
    Not.new(self)
  end

  class Not
    private *instance_methods.select { |m| m !~ /(^__|^\W|^binding$)/ }

    def initialize(subject)
      @subject = subject
    end

    def method_missing(sym, *args, &blk)
      !@subject.send(sym,*args,&blk)
    end
  end

  ##
  #   @person ? @person.name : nil
  # vs
  #   @person.try(:name)
  def try(method)
    send method if respond_to? method
  end

  def class_attr_accessor(*attrs)
    metaclass.send(:attr_accessor, *attrs)
  end
end
