-declareExceptionClass('SL::X::FormError');
-declareExceptionClass('SL::X::DBError' [ '%s', qw(error) ]);
-declareExceptionClass('SL::X::DBHookError', 'SL::X::DBError', [ '%s hook \'%s\' for object type \'%s\' failed', qw(when hook object_type object) ]);
-declareExceptionClass('SL::X::DBRoseError', 'SL::X::DBError', [ '\'%s\' in object of type \'%s\' occured', qw(error class) ]);
-declareExceptionClass('SL::X::DBUtilsError', 'SL::X::DBError', [ '%s: %s', qw(msg error) ]);
+
+# note! the default fields "message", "error" and "show_trace" are created by
+# Exception::Class if message or error are given, they are used for
+# stringification, so don't use them in error_templates
+#
+use Exception::Class (
+ 'SL::X::FormError' => {
+ isa => 'SL::X::Base',
+ },
+ 'SL::X::DBError' => {
+ isa => 'SL::X::Base',
+ fields => [ qw(msg db_error) ],
+ defaults => { error_template => [ '%s: %s', qw(msg db_error) ] },
+ },
+ 'SL::X::DBHookError' => {
+ isa => 'SL::X::DBError',
+ fields => [ qw(when hook object object_type) ],
+ defaults => { error_template => [ '%s hook \'%s\' for object type \'%s\' failed', qw(when hook object_type object) ] },
+ },
+ 'SL::X::DBRoseError' => {
+ isa => 'SL::X::DBError',
+ fields => [ qw(class metaobject object) ],
+ defaults => { error_template => [ '\'%s\' in object of type \'%s\' occurred', qw(db_error class) ] },
+ },
+ 'SL::X::DBUtilsError' => {
+ isa => 'SL::X::DBError',
+ },
+ 'SL::X::ZUGFeRDValidation' => {
+ isa => 'SL::X::Base',
+ },
+ 'SL::X::Inventory' => {
+ isa => 'SL::X::Base',
+ fields => [ qw(code) ],
+ },
+ 'SL::X::Inventory::Allocation' => {
+ isa => 'SL::X::Base',
+ fields => [ qw(code) ],
+ },
+);