Move build tools to tool/
[gitmo/Mouse.git] / tool / generate-mouse-tiny.pl
diff --git a/tool/generate-mouse-tiny.pl b/tool/generate-mouse-tiny.pl
new file mode 100644 (file)
index 0000000..71d6b60
--- /dev/null
@@ -0,0 +1,106 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use File::Find;
+use Fatal qw(open close);
+#use File::Slurp 'slurp';
+#use List::MoreUtils 'uniq';
+#use autodie;
+
+print "Generate Mouse::Tiny ...\n";
+
+sub slurp {
+    open my $in, '<', $_[0];
+    local $/;
+    return scalar <$in>;
+}
+sub uniq{
+    my %seen;
+    return grep{ !$seen{$_}++ } @_;
+}
+
+require 'lib/Mouse/Spec.pm';
+
+my $MouseTinyFile = shift || 'lib/Mouse/Tiny.pm';
+
+my @files;
+
+find({
+    wanted => sub {
+        push @files, $_
+            if -f $_
+            &&  /\.pm$/
+            && !/Squirrel/
+            && !/Tiny/
+            && !/Spec/         # has no functionality
+            && !/TypeRegistry/ # deprecated
+            && !/\bouse/       # ouse.pm
+    },
+    no_chdir => 1,
+}, 'lib');
+
+my $mouse_tiny = '';
+
+for my $file (uniq
+        'lib/Mouse/PurePerl.pm',
+        'lib/Mouse/Exporter.pm',
+        'lib/Mouse/Util.pm',
+        'lib/Mouse/Meta/TypeConstraint.pm',
+        'lib/Mouse/Util/TypeConstraints.pm',
+            sort @files) {
+
+    my $contents = slurp $file;
+
+    $contents =~ s/__END__\b.*//s;          # remove documentation
+    $contents =~ s/1;\n*$//;                # remove success indicator
+
+    $mouse_tiny .= "BEGIN{ # $file\n";
+    $mouse_tiny .= $contents;
+    $mouse_tiny .= "}\n";
+}
+
+open my $handle, ">$MouseTinyFile";
+
+print { $handle } << "EOF";
+# This file was generated by $0 from Mouse $Mouse::Spec::VERSION.
+#
+# ANY CHANGES MADE HERE WILL BE LOST!
+
+EOF
+
+print { $handle } << 'EOF';
+# if regular Mouse is loaded, bail out
+unless ($INC{'Mouse.pm'}) {
+    # tell Perl we already have all of the Mouse files loaded:
+EOF
+
+for my $file (@files) {
+    (my $inc = $file) =~ s{^lib/}{};
+    printf { $handle } "%-45s = __FILE__;\n", "\$INC{'$inc'}";
+}
+
+print { $handle } << 'EOF';
+eval sprintf("#line %d %s\n", __LINE__, __FILE__) . <<'END_OF_TINY';
+EOF
+
+print { $handle } "\n# and now their contents\n\n";
+
+print { $handle } $mouse_tiny;
+
+print { $handle } << 'EOF';
+END_OF_TINY
+    die $@ if $@;
+} # unless Mouse.pm is loaded
+EOF
+
+print { $handle } << 'EOF';
+package Mouse::Tiny;
+
+Mouse::Exporter->setup_import_methods(also => 'Mouse');
+
+1;
+EOF
+
+close $handle;
+
+print "done.\n";