* Flesh out the formerly incomplete ItemSlug class
* Convert all uses of text item slugs to use ItemSlug
* Move the ItemSlug class under models where it properly belongs
* Avoid the use of `slug` as a local variable or item attribute
wherever possible to avoid confusion between various kinds of slugs
* Merge the InventoryParser class into the Inventory class as it is
unlikely to need to support multiple versions
* Simplify the ModPack/Mod/ModVersion interfaces by replacing the use
of various "helper" methods with equivalent use of more generic
methods
* Update the various methods of ModPack/Mod/ModVersion to be able to
work with qualified or unqualified ItemSlugs
* Remove the unused BaseCollection class
* Add tests for ItemSlug and update all other tests to reflect
all the other changes
* Change default item URL to fall under /mod/<mod slug>/<item slug>
but kept the old URL pattern around with the old behavior (i.e.,
find the first item with that slug)
* Update Item to have a `qualifiedSlug` property which combines the
item's own slug with its Mod's slug. Updated a lot of code all
over to use this in preference to the plain slug.
* Add a `localizeTo` method to Inventory to allow non-qualified slugs
to be converted into qualified slugs within the inventory's stacks
* Update ModPack to work with either qualified or unqualified slugs
for relevant methods
* Fix model state changes to happen before related events are
triggered
* Add a debounce to the CraftingPlan object when triggering a recraft
due to changes in related objects (esp. its inventories)
* Update the Inventory's sort to keep items sorted by mod before name
with the Minecraft items sorted to the top
* Fix `ModPack.findItemByName` to actually recursively use the Mod's
method instead of slugifying the given name and looking for the
slug (since this won't necessarily work anymore).
* Ensure each Mod is assigned a reference to its containing ModPack
* Fix NameFinder to only consider an item non-gatherable if it is
also craftable
* Update ModVersionParserV1 to assign qualified slugs to recipes
for any items which are in the same mod (leaving any other slugs
unqualified)
* Add Underscore mixins for composing and decomposing slugs
* Update old tests for the use of qualified slugs, and some new tests
for the new methods added
Improve logging performance by using functions to delay when complex
strings are created until after the current logging level has been
checked to ensure that log statement is actually going to be printed.
There are many places where very complex objects are printed at lower
logging levels which this avoids.
* Create a nascent version of the mod detail page
* Make the slug mandatory for Mod instead of name, and load the name
from the data file
* Make the Feedback view universal on all pages
* Refactor the use of mod pack to have a single global object at the
router level which is shared between pages. Further, make this one
object load itself immediately and have it automatically load any
activated mod version
* Refactor the use of Storage related to mod pack versions into the
router as well.
* Add trace logging back in for events, but allow individual classes
to suppress it (as opposed to actually supressing the events)
* Fix a bug in ModVersion.eachItem where it would suggest so-called
items which are merely registered slugs without associated items
* Remove V1 of the mod version parser and shift V2 up to be V1
* Add a parser for mod.cg files, and refactor the the mod-version.cg
files to push the appropriate content up to the mod.cg
* Remove the concept of "silent" from BaseModel along with logging
each event as they are fired (which is what really prompted the
need for it in the first place)
* Move use of the Storage class to be completely the province of the
controllers most closely related to models affected
* Convert the ModVersionController to the ModController and have it
take on responsibility for choosing the mod version
* Update BaseModel to support simple accessors for the current state
* Update CraftingPlan to be able to remove uncraftable items
* Implement the Mod model
* Tweak style of quantity label in output box to be more visible
* Move data files for all mods under a directory for the specific
version of the mod
* Add a `silent` property to the base model to prevent models which
shouldn't be observed from emitting events
* Change the term "itemSlug" to just "slug" across the board
* Change all models so that they don't require their parent in their
constructors and so that they don't automatically add themselves to
their parents lists
* Remove a bunch of unnecessary event triggering
* Tighten up access to various lists of children across all models
* Refactor the guts of the V2 parser into an abstract base class so
it can be used for other parsers in the future
* Remove a number of unused methods
* Refactor location of all data files to include a subdirectory
for the mod version
* Update the BaseModel class to allow models to load themselves from
any text file (whether JSON or CG)
* Refactor ModPack & ModVersion to move the laoding functionality in
one into the other (and use the new stuff in BaseModel)
* Move the parser versions into a new subdirectory which allows for
future additional parsers