Architectural goals Six months (and several iterations later) a design I liked. In the end packing-lists are structured objects They can be read/written. This validates and normalizes the structure. Each object is a packing-element (base class) & further properties. Differences are implemented as methods Perl bonus: classes are "open" you can add a visitor later, as an after-thought All operations in the ports tree that manipulate packing-lists use this abstraction.