https://medium.com/reactive-programming/what-is-reactive-programming-bc9fa7f4a7fc#.fzbp0jnxr