#http://www.hashcode.eti.br
#shairon_toledo@gmail.com
# on Ter Ago  7 18:38:59 BRT 2007
module OnlyClass

  def []=(i,value=nil)
    if value.is_a? @classname
      super
    else
      raise TypeError.new "can't append #{value.class} into Array.only #{@classname}"
    end
  end
  
  def push(*elements)
    if elements.all? {|e| e.is_a? @classname}
      super
    else
      raise TypeError.new "only accept #{@classname} classes"
    end
  end

  def <<(value)
    if value.is_a? @classname 
      super
    else
      raise TypeError.new "can't append #{value.class} into Array.only #{@classname}"
    end
  end

  def method_missing(method_name, *args,&block)
    m=method_name.to_s.scan(/^each_(.*)$/).to_s
    if m.size > 0 
      ary=self.map{|v| v.send(m.to_sym,*args) }
      ary.each &block if block
      ary
    else
      super
    end
  end
end

class Array

  def Array.only(classname)
    a=[]
    a.instance_eval "@classname=nil"
    a.instance_variable_set('@classname',classname)
    a.extend(OnlyClass)
    a
  end

end


