You're almost there. The current code doesn't work because you're asking for `@zip`, `@bin` and `@manifest`, which are all still `nil` if their respective `zip`, `bin` and `manifest` methods haven't been called yet. So the trick is to never access these variables directly, and instead always go through their accessor methods. These accessor methods return the object you're looking for, and save it in the instance variable so the objects won't need to be created again the next time. So, the new body of `firmware_info` would be `manifest["firmware"]`—no `@`.

As for the private nature of the instance variables, these accessor methods `zip` and `bin` are nothing special, they're just methods that happen to return (and appropriately set) a backing instance variable. You should definitely be able to use the `private` keyword and put the definitions for these methods after that, so a user interfacing with `Pebble::Bundle` can't call them directly.