From: Originally by Ardo van Rangelrooij <ardo@debian.org>
Date: Mon, 6 May 2024 21:49:25 +0800
Subject: The Debian way of handling ParserDetails.ini

Use update-perl-sax-parsers(8) instead.

* SAX.pm: the meat of the modifications
  + add XML::SAX->save_parsers_debian(), used by update-perl-sax-parsers
  + disable XML::SAX->save_parsers() with a helpful error message for
    users trying to install SAX parsers manually from CPAN
* Makefile.PL: Don't try to modify ParserDetails.ini when building the package
* t/01known.t, t/99cleanup.t: Skip tests related to XML::SAX->save_parsers()
---
 Makefile.PL           |  4 ++++
 lib/XML/SAX.pm        | 13 +++++++++++++
 lib/XML/SAX/Debian.pm | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 t/01known.t           |  5 ++++-
 t/99cleanup.t         |  2 +-
 5 files changed, 69 insertions(+), 2 deletions(-)
 create mode 100644 lib/XML/SAX/Debian.pm

diff --git a/Makefile.PL b/Makefile.PL
index e3ff75d..dc59cfc 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -27,6 +27,10 @@ sub MY::install {
     package MY;
     my $script = shift->SUPER::install(@_);
 
+    print STDERR "Debian build: won't modify ParserDetails.ini when installing.\n";
+    print STDERR "              (use update-perl-sax-parsers(8) instead.)\n";
+    return $script;
+
     # Only modify existing ParserDetails.ini if user agrees
 
     my $write_ini_ok = 0;
diff --git a/lib/XML/SAX.pm b/lib/XML/SAX.pm
index 7cd93d2..5297a2b 100644
--- a/lib/XML/SAX.pm
+++ b/lib/XML/SAX.pm
@@ -179,6 +179,15 @@ sub add_parser {
 sub save_parsers {
     my $class = shift;
     
+    ### DEBIAN MODIFICATION
+    print "\n";
+    print "Please use 'update-perl-sax-parsers(8) to register this parser.'\n";
+    print "See /usr/share/doc/libxml-sax-perl/README.Debian.gz for more info.\n";
+    print "\n";
+
+    return $class; # rest of the function is disabled on Debian.
+    ### END DEBIAN MODIFICATION
+
     # get directory from wherever XML::SAX is installed
     my $dir = $INC{'XML/SAX.pm'};
     $dir = dirname($dir);
@@ -212,6 +221,10 @@ sub do_warn {
     warn(@_) unless $ENV{HARNESS_ACTIVE};
 }
 
+sub _is_vendor_supplied {
+    1;
+}
+
 1;
 __END__
 
diff --git a/lib/XML/SAX/Debian.pm b/lib/XML/SAX/Debian.pm
new file mode 100644
index 0000000..e767c73
--- /dev/null
+++ b/lib/XML/SAX/Debian.pm
@@ -0,0 +1,47 @@
+package XML::SAX::Debian;
+
+use strict;
+use warnings;
+
+use base "XML::SAX";
+
+use File::Spec ();
+
+sub save_parsers_debian {
+    my $class = shift;
+    my ($parser_module,$directory, $priority) = @_;
+
+    # add parser
+    {
+        # We do not want load_parsers to complain.
+        local $ENV{HARNESS_ACTIVE} = 1;
+        $class->load_parsers("/nonexistent");
+    }
+    $class->add_parser($parser_module);
+
+    # get parser's ParserDetails file
+    my $file = $parser_module;
+    $file = "${priority}-$file" if $priority != 0;
+    $file = File::Spec->catfile($directory, $file);
+    chmod 0644, $file;
+    unlink($file);
+
+    open(my $fh, ">$file") ||
+        die "Cannot write to $file: $!";
+
+    foreach my $p (@{ $class->parsers }) {
+        print $fh "[$p->{Name}]\n";
+        foreach my $key (keys %{$p->{Features}}) {
+            print $fh "$key = $p->{Features}{$key}\n";
+        }
+        print $fh "\n";
+    }
+
+    print $fh "\n";
+
+    close $fh;
+
+    return $class;
+}
+
+1;
diff --git a/t/01known.t b/t/01known.t
index a2db4f1..a9e2536 100644
--- a/t/01known.t
+++ b/t/01known.t
@@ -1,6 +1,9 @@
-use Test;
+use Test::More;
 BEGIN { plan tests => 3 }
+SKIP: {
+skip 'Tests skipped due to Debian modifications', 3;
 use XML::SAX;
 ok(XML::SAX->save_parsers);
 ok(XML::SAX->load_parsers);
 ok(@{XML::SAX->parsers}, 0);
+}
diff --git a/t/99cleanup.t b/t/99cleanup.t
index 32e196c..72f8438 100644
--- a/t/99cleanup.t
+++ b/t/99cleanup.t
@@ -1,7 +1,7 @@
 use Test;
 BEGIN { plan tests => 1 }
 use File::Spec;
-ok(unlink(
+skip('Test skipped due to Debian modifications', unlink(
     File::Spec->catdir(qw(blib lib XML SAX ParserDetails.ini))),
     1,
     'delete ParserDetails.ini'
