You could try something like this:

---begin---
class Gate
  @@gates = Array.new

  def Gate.[](key)
    @@gates[key]
  end

  def Gate.<<(g)
    @@gates << g
  end

  def Gate.each
    @@gates.each { yield }
  end

  def initialize
    @state = rand(2)
    @@gates << self
  end

  def state
    @state
  end

  def update
    @state = @@gates.first.state
    self
  end  
end

g = Gate.new
 => #<Gate:0x27f2218 @state=1>
h = Gate.new
 => #<Gate:0x27dbb08 @state=0>

g.state
 => 1
h.state
 => 0

Gate[0] == g
 => true
Gate[1] == h
 => true

h.update
 => #<Gate:0x27dbb08 @state=0>
h.state
 => 1
---end---

Does that fit what you're looking for?

Lennon