EliMina\Item

Added a class to encapsulate a single item available for order on the Eli Mina form.

Shipping calculations for the Eli Mina form work only based on height and weight, so the EliMina\Item class only currently encapsulates the name, height, and weight of a single item.
Measure

Since the code for the Eli Mina form is getting into the realm of units, added the Measure class, which is a base class which encapsulates the idea of a measurement taken using a convertible quantity of units.

Derived classes supply a static conversion table which allows units to be converted (using late static binding).
Weight

Added the Weight class, which extends Measure and provides constants and a conversion table for commonly-used weight units.
Measure Improvement

Added a check to the Measure constructor to ensure a conversion table entry for the given unit exists before the object is successfully constructed.

In so doing split the code that checks for a conversion table entry (and throws if there isn't one) into its own method.
SIPrefix

Wrote a class to abstract away handling of SI prefixes -- SIPrefix.
String::GetComparer

Added a GetComparer static method to the String class, which returns a function that can be used to compare two strings for Unicode equivalence, optionally without regard to case.
ArrayUtil

Added the ArrayUtil class, which will contain methods for performing operations on arrays.

Currently contains only the In method, which is a direct improvement on the PHP built-in method in_array:

- The In method always uses strict comparisons (unlike in_array, which defaults to loose comparisons)
- The In method allows for the user to supply a comparison function
- The In method (unlike -- infamously -- in_array) follows an established (C, Python) argument order, wherein methods that operate on an object, but do not (for whatever reason) receive an implicit this pointer/reference take the object to operate on as the first argument
UnitInfo

Added the UnitInfo class, which contains all information about a unit of measure.
ArrayUtil::Coalesce

Added the Coalesce static method to the ArrayUtil class, which takes some value, and returns it unchanged if it's an array, otherwise wraps it in an array and then returns it.

This method easily allows methods to take and operate on either a single value, or an array of such values -- the In static method did this internally previously, this has been switched to use the Coalesce method instead.
ArrayUtil::Find

Added the Find static method to the ArrayUtil class.  This method takes an array, a value, and optionally a boolean value and a comparison functor, and returns either the key at which the value exists in the array, or null if the value was not found.  The boolean value may be used to tell the function to throw rather than returning null.
UnitInfo Changes

Made several changes/improvements to the UnitInfo class:

- Plural forms of the unit's name are now stored
- Multiple conversion factors (one for each quantity the unit represents) can now be stored/retrieved
- Values passed into the constructor are more thoroughly validated (with exceptions being thrown on validation failure)
- The constructor code has been simplified by breaking repetition out into a private helper method
- The operation of IsSI has been tweaked to account for the fact that there may be multiple factors
- A name for the unit may now be easily retrieved via the GetName method
- A symbol (if one exists) for the unit may now be easily retrieved via the GetSymbol method
Measure/Weight Removal

The unit-handling utilities originally provided by the Measure class (extended by the Weight class specifically for weights) are inadequate and are being removed and replaced.
Add Case Insensitive Option to String::Equals

Added a third, optional argument to String::Equals, which toggles case insensitive matching.

Reimplemented String::GetComparer to leverage this.
UnitInfo Changes

After reviewing the list of SI units, the need to accommodate units which measure multiple quantities was found to be unnecessary.

Accordingly, it has been removed, simplifying the implementation of many parts of the UnitInfo class.
Unit

Added the Unit class, which represents a unit of measurement (including an SI prefix).
Pound Definition Update

Updated the definition of the pound within the Unit class:

- Added the "lbm" symbol
- Changed the conversion factor to reflect the new definition of "conversion factor" (i.e. number of SI base unit (gram in this case) per pound, rather than number of SI base unit (used to be kilogram) per pound)
Measure

Added the Measure class, which encapsulates a measurement and the units it was taken with, including allowing the conversion of that measurement to other units.
Unit Definitions

Added definitions for the foot, inch, mile, and litre.
\CanadaPost\Dimensions Update/Fixes

Updated the \CanadaPost\Dimensions class to allow the Measure class to be used for measurements.

Also:

- Fixed an inconsistency between the way the class serializes floating point values to XML and the way Canada Post expects
- Tweaked the class so that it reorders length/width/height into the order expected by Canada Post as it serializes, rather than when it's constructed (this prevents the user from inadvertently running afoul of the Canada Post API specification when/if they adjust the values between construction and serialization)
\CanadaPost\Parcel Update/Fixes

Updated the \CanadaPost\Parcel class to allow the Measure class to be used for parcel weight.

Also:

- Ensured that the weight is serialized to XML in the format that the Canada Post API expects
- Fixed a possible bug with respect to the oversized property