exception = { }
exn_mt    = { } 
setmetatable (exception, exn_mt)

function exn_mt.__lt(a,b) 
   return getmetatable(a) == exn_mt and 
      getmetatable(b) == exn_mt and
      b.super and a <= b.super
end

function exn_mt.__le (a,b) 
   return a==b or a<b 
end

function exception:new(...)
   local e = { super = self, new = self.new, args = {...} }
   setmetatable(e, getmetatable(self))
   return e
end

throw = error