     
     private var _box: Box?
     public lazy var box: Box = {
-        
-        let box = Box(boxId: self.boxId(), title: self.title)
-        let managedItems = self.items.allObjects as [ManagedItem]
-        let items = managedItems.map() { (item: ManagedItem) -> Item in
-            return item.item
-        }
-        box.items = items
-            
-        box.addObserver(self, forKeyPath: "title", options: .New, context: &boxContext)
-        box.addObserver(self, forKeyPath: "items", options: .New, context: &boxContext)
-        
+        let box = self.createBox()
+        self.observe(box)
         self._box = box
         return box
     }()
+    
+    func createBox() -> Box {
+        let box = Box(boxId: self.boxId(), title: self.title)
+        box.items = self.associatedItems()
+        
+        return box
+    }
+    
+    func associatedItems() -> [Item] {
+        let managedItems = self.items.allObjects as [ManagedItem]
+        return managedItems.map() { (item: ManagedItem) -> Item in
+            return item.item
+        }
+    }
+    
+    func observe(box: Box) {
+        box.addObserver(self, forKeyPath: "title", options: .New, context: &boxContext)
+        box.addObserver(self, forKeyPath: "items", options: .New, context: &boxContext)
+    }
     
     public override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
         

                }
            }
        }
        
        for item in items {
            let itemIsInExistingItems = contains(existingItems, { (existingItem: AnyObject) -> Bool in
                let managedItem = existingItem as ManagedItem

    
    deinit {
        if let box = _box {
            unobserve(box)
        }
    }

    func unobserve(box: Box) {
        box.removeObserver(self, forKeyPath: "title")
        box.removeObserver(self, forKeyPath: "items")
    }
}
