Attempts to populate an item's information with it's ID, returns result
        
        Note that the item id must already be set or otherwise supplied and that the item
        must exist in the associated user's inventory. 
           
        Parameters:
           usr (User) -- User who has the item
           itemID (str) -- The item's object ID
           
        Returns
           bool - True if successful, false otherwise
           
        Raises
           parseException

def populate(self, usr = None, itemID = None):
        """ Attempts to populate an item's information with it's ID, returns result
        
        Note that the item id must already be set or otherwise supplied and that the item
        must exist in the associated user's inventory. 
           
        Parameters:
           usr (User) -- User who has the item
           itemID (str) -- The item's object ID
           
        Returns
           bool - True if successful, false otherwise
           
        Raises
           parseException
        """
        if not self.id and not itemID:
            return False
            
        if not self.usr and not user:
            return False
        
        # Object's ID is used by default over any provided ID        
        if self.id: itemID = self.id
            
        # Same with the user
        if self.usr: usr = self.usr
        
        pg = usr.getPage("http://www.neopets.com/iteminfo.phtml?obj_id=" + str(itemID), vars = {'Referer': 'http://www.neopets.com/objects.phtml?type=inventory'})
        
        # Verify valid ID
        if "not in your inventory" in pg.content:
            logging.getLogger("neolib.item").exception("Invalid ID given, could not populate. ID: " + itemID)
            return False
        
        try:
            self.img = pg.table.img['src']
            self.name = pg.table.find_all("td")[1].text.split(" : ")[1].replace("Owner", "")
            self.desc = pg.find_all("div", align="center")[1].i.text
            
            stats = pg.table.next_sibling.table.find_all("td")
            
            self.type = stats[1].text
            self.weight = stats[3].text
            self.rarity = stats[5].text
            self.estVal = stats[7].text
        except Exception:
            logging.getLogger("neolib.item").exception("Failed to parse item details.", {'pg': pg})
            raise parseException
        
        return True