Based on TodoMVC.com