Please add sufficient comment on what each method does and when does it get called