Refactor, DRY and more extendable.
Change scope.
Change scope (http://git.io/AsJutA).