Honestly, I'm a bit lost here. The concept of lazy initialization is new to me. I tried to implement it as mentioned [here]() or [here]()

If I setup the code like this:

```ruby
	class Bundle
		def initialize(path)
			@path = path
			@manifest = nil
			@header = nil
			@zip = nil
			@bin = nil
		end

		attr_reader :path

		def zip
			@zip ||= Zip::File.open(path)
		end

		def bin
			@bin ||= @zip.file.read("pebble-app.bin")
		end

		def manifest
			@manifest ||= JSON.parse(@zip.file.read("manifest.json"))
		end

		def header
			@header ||= Bin::AppInfo.read(@bin)
		end

		alias :app_metadata :header

		def firmware_info
			@manifest["firmware"]
		end
```

I still get an error:

    bundle.rb:86:in `resources_info': undefined method `[]' for nil:NilClass (NoMethodError)
    	from bundle.rb:108:in `<main>'

(where line 86 is the `@manifest["firmware"]` and line 108 is calling `resources_info`).

And on top of that I loose the private nature of the `@bin` and `@zip` variables. When I try yo set the `bin` and `zip` variables `private` or `protected` I get errors when calling them. I've googled around a little bit but access control is still an unknown field to me.