basic cannon implementation