add more factory methods
make promise usage optional
update readme