Renamed internal properties to lowercase prefixed with $.
Added support for collections with properties.
Renamed IPattern to IProduct.
Removed old IProduct interface since we don't need to require the product interface definition to inherit from anything.