start to implement static type system