Looper, the newest sci-fi thriller from wunderkind director Rian Johnson, is a rare thing: it’s a perfect movie.

By that I don’t mean it’s the world’s best movie, or even the year’s best. What I mean is that Johnson and his crew created a movie that manages to perfectly embody its own story and present it in a visually compelling, complementary way with great performances, intriguing dialogue, and just enough gravitas to hold the whole thing afloat.

In a very brief nutshell: Looper tells the story of JOE, who works as a “looper.” 30 years in the future, time travel is invented and then outlawed. But murder is a lot harder to get away with in the future, so shady mafia types send victims back in time 30 years to the semi-dystopia present. A looper is a guy who is paid to shoot these guys, sight unseen. They’re called “loopers” because the last person they kill is themselves, thus closing the loop. Joe runs into trouble when Old Joe (Bruce Willis) isn’t willing to close out the loop.

Time Travel movies always excite me, but rarely satisfy me. The biggest problem is that people want to get tricky with their mythology. Doctor Who (which I love) is one of the worst offenders with this – time travel always works one way, until one time, and for great dramatic emphasis, it doesn’t. In Looper, the rules of time travel are established early on. There’s a linear loop that exists between the time 30 years in the future and our time, and that loop is closed. Meaning as time moves forward thirty years in the future, it does so at the same clip in our time. Meaning that if you cut off the finger of a man in the past, it affects said man in the future as though it’s happening in real time.

They also establish the idea that the future can be changed and simply refuse to allow that to cause any infinite plot hole loops. In fact, in one scene where Joseph Gordon Levitt tries to interrogate future-Levitt Bruce Willis about their shared future/past, Bruce Willis literally YELLS down the plot holes. We’re not coming to Looper for crazy time/space shenanigans. The rules are clear.

Because they make the rules so clear, the movie gets to be a fun, twisty, genre-bending adventure. The characters are beautifully defined by little moments (the trigger they either decided to pull or not pull – the things they cherish most in the world) and stay remarkably consistent as the film trundles forward towards its conclusion.

In the trailers, the makeup and prosthetics used to make Joseph Gordon Levitt resemble a thirty years younger Bruce Willis seemed distracting and cumbersome. On screen, Levitt makes the character of Young Joe so fully rounded and perfect (and so casually and beautifully adopts Willis’s distinct mannerisms) that you forget that his face has been changed at all. Willis has a far easier time, since Old Joe is pretty much designed to be played by Willis and Willis alone, but makes the most out of his aging action star grace. By the time Emily Blunt arrives as a protective, bad ass mother to an unstable son, we already think we’re watching one movie, and I for one was almost disappointed to have to give up that movie to watch this new one. But Blunt gives one of her career best performances, completely eliminating her natural British poshness and fitting in perfectly.

I’m not going to go into the plot too much, but suffice it to say that Looper keeps you guessing. It feels like one of those movies that is going to collapse under the weight of its own premise (see also: The Adjustment Bureau), but it actually exceeds expectations.

It’s also a lot of fun, often laugh-out-loud funny and engaging in a way that actually reminded me a lot of Joss Whedon’s Firefly. Looper is probably not the best movie of the year, but it is the most wholly satisfying one I’ve seen in a long time.