Add proper args and kwargs support + refactor