3. lastly add a simple binding in AppModule, a Singleton is the default scope so we only require this:

binder.bind(FailedLoginTracker.class)

4. I have tried to keep the example above as simple as possible, but there are a number of enhancements that one could recommend, the most obvious being more intelligent tracking options other than just the IP, as well as the following modification, which ensures that the FailedLogin object expires (resetting itself) once its 'time to live' passes. The following code is untested therefore omitted from step 1.