>  M.[] needs to return a subclass of T (lets call it S) so that calls
>        S.new(c) are translated to T.new(am,bm,c).
> 

Note I am cheating;-)

class T
  def initialize(a,b,k)
    p "#{a} #{b} #{k}"
   end
end


module M
  T = T
  def M.[](*l)
    s = Class::new (T)
    s.const_set :L, l.dup
    s.class_eval %{ def initialize (*r,&b); super (*(L + r),&b) end }
    return s
  end
end

Bla = M[1,2]

Bla.new 5