MJR>  require 'etc'
MJR>  class Users
MJR>    include Etc
MJR>    include Enumerable
MJR>    def each
MJR>      setpwent
MJR>      while pw = getpwent
MJR>        yield pw
MJR>      end
MJR>      endpwent
MJR>    end
MJR>  end
MJR>  Users.new.each { |u| puts u.name }

ES> Simpler:
ES> 
ES> require 'etc'
ES> class Users
ES>     include Etc
ES>     include Enumerable
ES>     alias :each :passwd
ES>     public :each
ES> end

Simpler, but not equivalent.  That version starts wherever the last
call to getpwent passwd left off, instead of starting over at the 
first entry.

-Mark