add stream
add metaprogramming