Added some generics and moved state update responsability to each
builder