Subject: bug#26776: closed (Re: bug#26776: [PATCH] gnu: Add Parcimonie.)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 26 Oct 2017 21:13:02 +0000

Your bug report

#26776: [PATCH] gnu: Add Parcimonie.

which was filed against the guix-patches package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
26776: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=26776
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#26776: [PATCH] gnu: Add Parcimonie.
From: Ricardo Wurmus <[email-masked]>
To: Ludovic Courtès <[email-masked]>
Cc: Petter <[email-masked]>, [email-masked]
Date: Wed, 25 Oct 2017 10:53:46 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi Petter,

I have split the patch into separate commits, fixed some incorrect
licenses and descriptions, enabled tests where possible, changed
“inputs” to “propagated-inputs” where appropriate, and updated some of
the packages.

I skipped some non-essential packages such as perl-app-nopaste and its
dependencies, because it was not needed after all, and it reduced the
overall amount of work.

The result is the parcimonie package added with commit 15b084425 in
master.

Thanks for the contribution!

--
Ricardo

GPG: BCA6 89B6 3655 3801 C3C6  2150 197A 5888 235F ACAC
https://elephly.net

Subject: [PATCH] gnu: Add Parcimonie.
From: Petter <[email-masked]>
To: [email-masked]
Date: Thu, 4 May 2017 13:51:28 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi Guix,

So I'm looking to improve my key management skills and was reading this article,
https://riseup.net/en/security/message-security/openpgp/best-practices
I had not heard of Parcimonie before, but I immediately liked the idea of it.
And since Parcimonie wasn't packaged for Guix I of course figured I should
package it real quick. After all, a program that just refreshes your keyring
every now and then shouldn't be too complex and need a lot of dependencies,
maybe a few, right?

Well, it needed a lot. And the dependencies needed a lot of dependencies. And
also some of the dependencies dependencies required many dependencies. Great! I
naively jumped into this, and at any one point had no idea if I was packaging
the last module or not (I'm sure you're familiar with this). Think I got the
last one in the end though. But it's taken waaay more time than I anticipated.
Also with 56 packages it becomes difficult to make sure each of them is on
standard, so I assume some are below standard.

It would be particularly interesting if someone with some Parcimonie experience
could try it, and report if there's any missing features etc.. I haven't used
it before and have just started it a few times to see that it can at least
start.

Back to the article for me :)

Best,
Petter

From fdf2b751d19a1c9397535cb5054557b1fd711d23 Mon Sep 17 00:00:00 2001
From: Petter <[email-masked]>
Date: Sun, 30 Apr 2017 11:40:06 +0200
Subject: [PATCH] gnu: Add Parcimonie.

* gnu/packages/gnupg.scm: New variables.
* gnu/packages/perl.scm: Same.
* gnu/packages/web.scm: Same.
* gnu/packages/xml.scm: Same.
---
 gnu/packages/gnupg.scm |  125 +++++
 gnu/packages/perl.scm  | 1290 ++++++++++++++++++++++++++++++++++++++++++++++--
 gnu/packages/web.scm   |  279 ++++++++++-
 gnu/packages/xml.scm   |  160 ++++++
 4 files changed, 1800 insertions(+), 54 deletions(-)

diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 3edb15770..df7d135a5 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -12,6 +12,7 @@
 ;;; Copyright © 2016 Mike Gerwitz <[email-masked]>
 ;;; Copyright © 2016 Troy Sankey <[email-masked]>
 ;;; Copyright © 2017 Leo Famulari <[email-masked]>
+;;; Copyright © 2017 Petter <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -49,10 +50,15 @@
   #:use-module (gnu packages security-token)
   #:use-module (gnu packages swig)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages web)
+  #:use-module (gnu packages tor)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system perl)
   #:use-module (guix build-system python))
 
 (define-public libgpg-error
@@ -745,3 +751,122 @@ qualities.  To reconstruct a secret key, you re-enter those
 bytes (whether by hand, OCR, QR code, or the like) and paperkey can use
 them to transform your existing public key into a secret key.")
     (license license:gpl2+)))
+
+(define-public parcimonie
+  (package
+    (name "parcimonie")
+    (version "0.10.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://gaffer.ptitcanardnoir.org/"
+                                  "intrigeri/files/parcimonie/App-Parcimonie-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1gni9wsjgyqh99pc087n33b06lk0kmxqb98y16a9bcrs4izzrsg0"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("glib" ,glib)
+       ("gtk+" ,gtk+)
+       ("gnupg" ,gnupg)
+       ("pango" ,pango)
+       ("perl-config-general" ,perl-config-general)
+       ("perl-clone" ,perl-clone)
+       ("perl-data" ,perl-data)
+       ("perl-exporter-tiny" ,perl-exporter-tiny)
+       ("perl-file-homedir" ,perl-file-homedir)
+       ("perl-file-sharedir" ,perl-file-sharedir)
+       ("perl-file-which" ,perl-file-which)
+       ("perl-getopt-long-descriptive" ,perl-getopt-long-descriptive)
+       ("perl-gnupg-interface" ,perl-gnupg-interface)
+       ("perl-ipc-system-simple" ,perl-ipc-system-simple)
+       ("perl-list-moreutils" ,perl-list-moreutils)
+       ("perl-libintl-perl" ,perl-libintl-perl) ; Locale::TextDomain
+       ("perl-lwp-online" ,perl-lwp-online)
+       ("perl-module-build" ,perl-module-build)
+       ("perl-module-pluggable-object" ,perl-module-pluggable)
+       ("perl-moo" ,perl-moo)
+       ("perl-moox-handlesvia" ,perl-moox-handlesvia)
+       ("perl-moox-late" ,perl-moox-late)
+       ("perl-moox-options" ,perl-moox-options)
+       ("perl-namespace-clean" ,perl-namespace-clean)
+       ("perl-net-dbus" ,perl-net-dbus)
+       ("perl-net-dbus-glib" ,perl-net-dbus-glib)
+       ("perl-path-tiny" ,perl-path-tiny)
+       ("perl-test-most" ,perl-test-most)
+       ("perl-test-trap" ,perl-test-trap)
+       ("perl-time-duration" ,perl-time-duration)
+       ("perl-time-duration-parse" ,perl-time-duration-parse)
+       ("perl-try-tiny" ,perl-try-tiny)
+       ("perl-type-tiny" ,perl-type-tiny)
+       ("perl-types-path-tiny" ,perl-types-path-tiny)
+       ("perl-unicode-linebreak" ,perl-unicode-linebreak)
+       ("perl-xml-parser" ,perl-xml-parser)
+       ("perl-xml-twig" ,perl-xml-twig)
+       ("torsocks" ,torsocks)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'wrap-program
+                    (lambda* (#:key inputs outputs #:allow-other-keys)
+                      (substitute*
+                          (string-append
+                           (assoc-ref outputs "out")
+                           "/lib/perl5/site_perl/5.24.0/"
+                           "App/Parcimonie/GnuPG/Interface.pm")
+                        (("gpg2") "gpg"))
+                                                 
+                      (wrap-program (string-append
+                                     (assoc-ref outputs "out")
+                                     "/bin/parcimonie")
+                        `("PERL5LIB" ":"
+                          prefix (,
+                                  (string-append
+                                   (assoc-ref outputs "out")
+                                   "/lib/perl5/site_perl/5.24.0/:"
+                                   (getenv "PERL5LIB"))))
+                        `("PATH" ":"
+                          prefix (,(string-append
+                                    (assoc-ref inputs "torsocks")
+                                    "/bin/")))))))
+       #:tests? #f)) ; gpg-connect-agent tries to create /homeless-shelter/
+    (home-page "https://gaffer.ptitcanardnoir.org/intrigeri/code/parcimonie/")
+    (synopsis "Incrementally refreshes a GnuPG keyring")
+    (description
+     "Parcimonie incrementaly refreshes a GnuPG keyring in a way that:
+@enumerate
+@item makes it hard to correlate her keyring content to an individual;
+@item makes it hard to locate an individual based on an identifying subset of her keyring content.
+@end enumerate
+Parcimonie is a daemon that fetches one key at a time using the Tor network, waits a bit, changes the Tor circuit being used, and starts over.")
+    (license license:gpl1+)))
+
+(define-public perl-gnupg-interface
+  (package
+    (name "perl-gnupg-interface")
+    (version "0.52")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://cpan/authors/id/A/AL/ALEXMV/"
+                                  "GnuPG-Interface-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0dgx8yhdsmhkazcrz14n4flrk1afv7azgl003hl4arxvi1d9yyi4"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("which" ,which)
+       ("gpg" ,gnupg)
+       ("perl-data" ,perl-data)
+       ("perl-exporter-tiny" ,perl-exporter-tiny)
+       ("perl-list-moreutils" ,perl-list-moreutils)
+       ("perl-moo" ,perl-moo)
+       ("perl-moox-handlesvia" ,perl-moox-handlesvia)
+       ("perl-moox-late" ,perl-moox-late)
+       ("perl-type-tiny" ,perl-type-tiny)))
+    (arguments
+     `(#:tests? #f)) ; gpg: signing failed: No pinentry
+    (synopsis "Lorem Ipsum")
+    (description "Lorem Ipsum")
+    (home-page (string-append "http://search.cpan.org/~gward/"
+                              "Getopt-Tabular-" version))
+    (license license:perl-license)))
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index 3eb7815f2..76a5b7982 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2017 Marius Bakke <[email-masked]>
 ;;; Copyright © 2017 humanitiesNerd <[email-masked]>
 ;;; Copyright © 2017 Tobias Geerinckx-Rice <[email-masked]>
+;;; Copyright © 2017 Petter <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -33,14 +34,18 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages perl)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix licenses)
   #:use-module (gnu packages)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
+  #:use-module (gnu packages glib)
   #:use-module (gnu packages perl-web)
-  #:use-module (gnu packages pkg-config))
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages xml) ; "expat" imported from licenses and xml
+  #:use-module (gnu packages web))
 
 ;;;
 ;;; Please: Try to add new module packages in alphabetic order.
@@ -256,6 +261,27 @@ variable ANY_MOOSE to be Moose or Mouse.")
 configuration files and parsing command line arguments.")
     (license (package-license perl))))
 
+(define-public perl-archive-extract
+(package
+  (name "perl-archive-extract")
+  (version "0.80")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/B/BI/BINGOS/Archive-Extract-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1x15j1q6w6z8hqyqgap0lz4qbq2174wfhksy1fdd653ccbaw5jr5"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/Archive-Extract")
+  (synopsis "Generic archive extracting mechanism")
+  (description "It allows you to extract any archive file of the type .tar, .tar.gz, .gz, .Z, tar.bz2, .tbz, .bz2, .zip, .xz,, .txz, .tar.xz or .lzma without having to worry how it does so, or use different interfaces for each type by using either perl modules, or commandline tools on your system.")
+  (license (package-license perl))))
+
 (define-public perl-archive-zip
   (package
     (name "perl-archive-zip")
@@ -357,6 +383,51 @@ autovivification for some constructs and optionally throws a warning or an
 error when it would have happened.")
     (license (package-license perl))))
 
+(define-public perl-b-keywords
+(package
+  (name "perl-b-keywords")
+  (version "1.15")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/R/RU/RURBAN/B-Keywords-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1nhdplmd0y69lnwyajg3anhk6pm13nm6qzm05nzpz8zl7j7fzlk5"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/B-Keywords")
+  (synopsis
+    "Lists of reserved barewords and symbol names")
+  (description "@code{B::Keywords} supplies several arrays of exportable keywords: @code{@@Scalars, @@Arrays, @@Hashes, @@Filehandles, @@Symbols, @@Functions, @@Barewords, @@TieIOMethods, @@UNIVERSALMethods and @@ExporterSymbols}.")
+  (license license:gpl2)))
+
+(define-public perl-browser-open
+(package
+  (name "perl-browser-open")
+  (version "0.04")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/C/CF/CFRANKS/Browser-Open-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "0rv80n5ihy9vnrzsc3l7wlk8880cwabiljrydrdnxq1gg0lk3sxc"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/Browser-Open")
+  (synopsis "Open a browser in a given URL")
+  (description "The functions optionaly exported by this module allows you to open URLs in the user browser.
+
+A set of known commands per OS-name is tested for presence, and the first one found is executed.  With an optional parameter, all known commands are checked.")
+  (license (package-license perl))))
+
 (define-public perl-base
   (package
     (name "perl-base")
@@ -708,6 +779,30 @@ cases where the clan modules are not classes derived from each other, and thus
 the Carp.pm module doesn't help.")
     (license (package-license perl))))
 
+(define-public perl-carp-always
+(package
+  (name "perl-carp-always")
+  (version "0.13")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/F/FE/FERREIRA/Carp-Always-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "0i2rifkr7ybfcdsqana52487z7vxp2l5qdra0f6ik0ddhn6rzii1"))))
+  (build-system perl-build-system)
+  (native-inputs
+    `(("perl-test-base" ,perl-test-base)))
+  (home-page
+    "http://search.cpan.org/dist/Carp-Always")
+  (synopsis
+    "Warns and dies noisily with stack backtraces")
+  (description "This module is meant as a debugging aid. It can be used to make a script complain loudly with stack backtraces when warn()ing or die()ing.")
+  (license (package-license perl))))
+
 (define-public perl-cddb-get
   (package
     (name "perl-cddb-get")
@@ -727,6 +822,30 @@ the Carp.pm module doesn't help.")
     ;; Either GPLv2 or the "Artistic" license.
     (license (list gpl2 artistic2.0))))
 
+(define-public perl-clipboard
+(package
+  (name "perl-clipboard")
+  (version "0.13")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/K/KI/KING/Clipboard-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "12pc8q04nrqp2mvr74nrrkw4gkv7g4a1gq6smd8fhjs8naf1rgzf"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/Clipboard")
+  (synopsis
+    "Cliboard - Copy and Paste with any OS")
+  (description "Who doesn't remember the first time they learned to copy and paste, and generated an exponentially growing text document? Yes, that's right, clipboards are magical.
+
+With Clipboard.pm, this magic is now trivial to access, in a cross-platform-consistent API, from your Perl code.")
+  (license (package-license perl))))
+
 (define-public perl-class-accessor
   (package
     (name "perl-class-accessor")
@@ -1069,6 +1188,45 @@ is run in place of the original method, with a hook to easily call that
 original method.")
     (license (package-license perl))))
 
+(define-public perl-class-refresh
+(package
+  (name "perl-class-refresh")
+  (version "0.07")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/D/DO/DOY/Class-Refresh-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1cxyshgxpk98icwws2jpgix6m53qsn43c8izxqm5mcybam9h7c73"))))
+  (build-system perl-build-system)
+  (native-inputs
+    `(("perl-test-fatal" ,perl-test-fatal)
+      ("perl-test-requires" ,perl-test-requires)))
+  (inputs
+    `(("perl-class-load" ,perl-class-load)
+      ("perl-class-unload" ,perl-class-unload)
+      ("perl-devel-overrideglobalrequire"
+       ,perl-devel-overrideglobalrequire)
+      ("perl-moose" ,perl-moose)
+      ("perl-try-tiny" ,perl-try-tiny)))
+  (home-page
+    "http://search.cpan.org/dist/Class-Refresh")
+  (synopsis "Refresh your classes during runtime")
+  (description "During development, it is fairly common to cycle between
+writing code and testing that code.  Generally the testing happens within the
+test suite, but frequently it is more convenient to test things by hand when
+tracking down a bug, or when doing some exploratory coding.  In many
+situations, however, this becomes inconvenient - for instance, in a REPL, or
+in a stateful web application, restarting from the beginning after every code
+change can get pretty tedious.  This module allows you to reload your
+application classes on the fly, so that the code/test cycle becomes a lot
+easier.")
+  (license (package-license perl))))
+
 (define-public perl-class-singleton
   (package
     (name "perl-class-singleton")
@@ -1173,6 +1331,30 @@ objects.")
                               "Clone-" version))
     (license (package-license perl))))
 
+(define-public perl-clone-pp
+  (package
+  (name "perl-clone-pp")
+  (version "1.07")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/N/NE/NEILB/Clone-PP-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "15dkhqvih6rx9dnngfwwljcm9s8afb0nbyl2vdvhd8frnw4y31dz"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/Clone-PP")
+  (synopsis "Recursively copy Perl datatypes")
+  (description "This module provides a general-purpose clone function to make
+deep copies of Perl data structures.  It calls itself recursively to copy
+nested hash, array, scalar and reference types, including tied variables and
+objects.")
+  (license (package-license perl))))
+
 (define-public perl-common-sense
   (package
     (name "perl-common-sense")
@@ -1282,6 +1464,36 @@ options.")
 and writing of @code{.ini}-style configuration files.")
     (license (package-license perl))))
 
+(define-public perl-config-ini-reader-ordered
+(package
+  (name "perl-config-ini-reader-ordered")
+  (version "0.020")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/R/RJ/RJBS/Config-INI-Reader-Ordered-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "07gpp6q3l4i84vqx49f5fn626dwrxy07ld7j2zgaxrj8za54b12r"))))
+  (build-system perl-build-system)
+  (inputs
+   `(("perl-config-ini" ,perl-config-ini)
+     ("perl-mixin-linewise" ,perl-mixin-linewise)
+     ("perl-perlio-utf8_strict" ,perl-perlio-utf8_strict)
+     ("perl-sub-exporter" ,perl-sub-exporter)))
+  (home-page
+    "http://search.cpan.org/dist/Config-INI-Reader-Ordered")
+  (synopsis
+    ".ini-file parser that returns sections in order")
+  (description "@code{Config::INI::Reader::Ordered} is a subclass of
+@code{Config::INI::Reader} which preserves section order. See
+@code{Config::INI::Reader} for all documentation; the only difference is as
+presented in the \"SYNOPSIS\".")
+  (license (package-license perl))))
+
 (define-public perl-context-preserve
   (package
     (name "perl-context-preserve")
@@ -1305,6 +1517,28 @@ the context the subroutine would have seen if it were the last statement in
 the caller.")
     (license (package-license perl))))
 
+(define-public perl-cpan-changes
+(package
+  (name "perl-cpan-changes")
+  (version "0.400002")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/H/HA/HAARG/CPAN-Changes-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "13dy78amkhwg278sv5im0ylyskhxpfivyl2aissqqih71nlxxvh1"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/CPAN-Changes")
+  (synopsis "Read and write Changes files")
+  (description "This module allows CPAN authors to write automated tests to
+ensure their changelogs match the specification.")
+  (license (package-license perl))))
+
 (define-public perl-cpan-meta-check
   (package
     (name "perl-cpan-meta-check")
@@ -1582,6 +1816,98 @@ on one page.  This results in wanting to page through various pages of data.
 The maths behind this is unfortunately fiddly, hence this module.")
     (license (package-license perl))))
 
+(define-public perl-data
+  (package
+    (name "perl-data")
+    (version "0.002009")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/M/MA/MATTP/"
+                           "Data-Perl-" version ".tar.gz"))
+       (sha256
+        (base32
+         "12vgqdjbfqf2qfg21x22wg88xnwxfbw2ki3qzcb3nb0chwjj4axn"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-deep" ,perl-test-deep)
+       ("perl-test-output" ,perl-test-output)
+       ("perl-test-fatal" ,perl-test-fatal)))
+    (inputs
+     `(("perl-class-method-modifiers" ,perl-class-method-modifiers)
+       ("perl-list-moreutils" ,perl-list-moreutils)
+       ("perl-module-runtime" ,perl-module-runtime)
+       ("perl-role-tiny" ,perl-role-tiny)
+       ("perl-strictures" ,perl-strictures)))
+    (home-page "http://search.cpan.org/dist/Data-Perl")
+    (synopsis "Base classes wrapping fundamental Perl data types")
+    (description "Collection of classes that wrap fundamental data types that
+exist in Perl.  These classes and methods as they exist today are an attempt
+to mirror functionality provided by Moose's Native Traits.  One important
+thing to note is all classes currently do no validation on constructor
+input.")
+    (license (package-license perl))))
+
+(define-public perl-data-printer
+  (package
+  (name "perl-data-printer")
+  (version "0.39")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/G/GA/GARU/Data-Printer-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "16b449vargvk39f7m4v23lhrzlk2500x2mcp0njhxx2y78s4i616"))))
+  (build-system perl-build-system)
+  (inputs
+    `(("perl-clone-pp" ,perl-clone-pp)
+      ("perl-file-homedir" ,perl-file-homedir)
+      ("perl-package-stash" ,perl-package-stash)
+      ("perl-sort-naturally" ,perl-sort-naturally)))
+  (home-page
+    "http://search.cpan.org/dist/Data-Printer")
+  (synopsis
+    "Colored pretty-print of Perl data structures and objects")
+  (description "Display Perl variables and objects on screen, properly
+formatted (to be inspected by a human).")
+  (license (package-license perl))))
+
+(define-public perl-data-record
+  (package
+    (name "perl-data-record")
+    (version "0.002")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/O/OV/OVID/"
+                           "Data-Record-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1gwyhjwg4lrnfsn8wb6r8msb4yh0y4wca4mz3z120xbnl9nycshx"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-exception" ,perl-test-exception)))
+    (inputs
+     `(("perl-module-build" ,perl-module-build)
+       ("perl-sub-uplevel" ,perl-sub-uplevel)))
+    (home-page "http://search.cpan.org/dist/Data-Record")
+    (synopsis "\"split\" on steroids")
+    (description "Sometimes we need data split into records and a simple split
+on the input record separator @code{$/} or some other value fails because the
+values we're splitting on may allowed in other parts of the data.  Perhaps
+they're quoted.  Perhaps they're embedded in other data which should not be
+split up.
+
+This module allows you to specify what you wish to split the data on, but also
+speficy an \"unless\" regular expression.  If the text in question matches the
+\"unless\" regex, it will not be split there.  This allows us to do things like
+split on newlines unless newlines are embedded in quotes.")
+    (license (package-license perl))))
+
 (define-public perl-data-stag
   (package
     (name "perl-data-stag")
@@ -2262,6 +2588,33 @@ you can tell it to compile a C source file with optional linker flags.")
 equivalent of \"$@{^GLOBAL_PHASE@} eq 'DESTRUCT'\" for older perls.")
     (license (package-license perl))))
 
+(define-public perl-devel-hide
+(package
+  (name "perl-devel-hide")
+  (version "0.0009")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/F/FE/FERREIRA/Devel-Hide-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1phnzbw58v6551nhv6sg86m72nx9w5j4msh1hg4jvkakkq5w9pki"))))
+  (build-system perl-build-system)
+  (inputs
+    `(("perl-test-pod" ,perl-test-pod)
+      ("perl-test-pod-coverage" ,perl-test-pod-coverage)))
+  (home-page
+    "http://search.cpan.org/dist/Devel-Hide")
+  (synopsis
+    "Forces the unavailability of specified Perl modules (for testing)")
+  (description "Given a list of Perl modules/filenames, this module makes
+require and use statements fail (no matter the specified files/modules are
+installed or not).")
+  (license (package-license perl))))
+
 (define-public perl-devel-lexalias
   (package
     (name "perl-devel-lexalias")
@@ -2309,6 +2662,30 @@ operators for a given class (or object), including where in the inheritance
 hierarchy the overloads are declared and where the code implementing it is.")
     (license (package-license perl))))
 
+(define-public perl-devel-overrideglobalrequire
+  (package
+  (name "perl-devel-overrideglobalrequire")
+  (version "0.001")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/D/DA/DAGOLDEN/Devel-OverrideGlobalRequire-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1yayg0838b58dqg8acahhw885s0yvchjyf2fm7s2ladfwcnqk487"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/Devel-OverrideGlobalRequire")
+  (synopsis
+    "Override @code{CORE::GLOBAL::require} safely")
+  (description "This module overrides @code{CORE::GLOBAL::require} with a code
+reference in a way that plays nice with any existing overloading and ensures
+the right calling package is in scope.")
+  (license (package-license perl))))
+
 (define-public perl-devel-partialdump
   (package
     (name "perl-devel-partialdump")
@@ -2566,7 +2943,7 @@ also known as JIS 2000.")
 part of Perl by default, including \"BIG5-1984\", \"BIG5-2003\", \"BIG5PLUS\",
 \"BIG5EXT\", \"CCCII\", \"EUC-TW\", \"CNS11643-*\", \"GB18030\", and
 \"UNISYS\".")
-    (license expat)))
+    (license license:expat)))
 
 (define-public perl-env-path
   (package
@@ -2868,6 +3245,41 @@ It is really just boilerplate code that you would have written yourself.")
 changes made to any file.")
     (license artistic2.0)))
 
+(define-public perl-file-configdir
+  (package
+    (name "perl-file-configdir")
+    (version "0.017")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/R/RE/REHSACK/"
+                           "File-ConfigDir-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0y3nx93r4m7fl07zzz1ql7jm88mskx6pnd54lrrb7pwfmd8nwbx7"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-file-homedir" ,perl-file-homedir)
+       ("perl-list-moreutils" ,perl-list-moreutils)))
+    (home-page "http://search.cpan.org/dist/File-ConfigDir")
+    (synopsis "Get directories of configuration files")
+    (description "This module is a helper for installing, reading and finding
+configuration file locations.  It's intended to work in every supported Perl5
+environment and will always try to Do The Right Thing(tm).
+
+@code{File::ConfigDir} is a module to help out when perl modules (especially
+applications) need to read and store configuration files from more than one
+location. Writing user configuration is easy thanks to @code{File::HomeDir},
+but what when the system administrator needs to place some global
+configuration or there will be system related configuration (in /etc on
+UNIX(tm) or $ENV@{windir@} on Windows(tm)) and some network configuration in nfs
+mapped /etc/p5-app or $ENV@{ALLUSERSPROFILE@} . \"\\Application Data\\p5-app\",
+respectively.
+
+@code{File::ConfigDir} has no \"do what I mean\" mode - it's entirely up to
+the user to pick the right directory for each particular application.")
+    (license (package-license perl))))
+
 (define-public perl-file-copy-recursive
   (package
     (name "perl-file-copy-recursive")
@@ -3285,7 +3697,7 @@ single-letter approach, is provided but not enabled by default.")
 (define-public perl-getopt-long-descriptive
   (package
     (name "perl-getopt-long-descriptive")
-    (version "0.098")
+    (version "0.100")
     (source
      (origin
        (method url-fetch)
@@ -3293,10 +3705,11 @@ single-letter approach, is provided but not enabled by default.")
                            "Getopt-Long-Descriptive-" version ".tar.gz"))
        (sha256
         (base32
-         "08lphvqshcajvvd6z4rvcda6rx5kz8pysrsip4nfv2mbks95p9ma"))))
+         "1dpz5nhg5glmrpq46nkc90dg19cfqfjspqwhfvihsqyi229yfl8l"))))
     (build-system perl-build-system)
     (native-inputs
-     `(("perl-test-fatal" ,perl-test-fatal)
+     `(("perl-cpan-meta-check" ,perl-cpan-meta-check)
+       ("perl-test-fatal" ,perl-test-fatal)
        ("perl-test-warnings" ,perl-test-warnings)))
     (propagated-inputs
      `(("perl-params-validate" ,perl-params-validate)
@@ -3373,6 +3786,37 @@ objects, which execute a given code block when destroyed, and scoped guards,
 which are tied to the scope exit.")
     (license (package-license perl))))
 
+(define-public perl-hash-fieldhash
+  (package
+  (name "perl-hash-fieldhash")
+  (version "0.15")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/G/GF/GFUJI/Hash-FieldHash-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1wg8nzczfxif55j2nbymbhyd25pjy7dqs4bvd6jrcds3ll3mflaw"))))
+  (build-system perl-build-system)
+  (native-inputs
+    `(("perl-module-build" ,perl-module-build)
+      ("perl-test-leaktrace" ,perl-test-leaktrace)))
+  (home-page
+    "http://search.cpan.org/dist/Hash-FieldHash")
+  (synopsis
+    "Lightweight field hash for inside-out objects")
+  (description "@code{Hash::FieldHash} provides the field hash mechanism which
+supports the inside-out technique.
+
+You may know @code{Hash::Util::FieldHash}. It's a very useful module, but too
+complex to understand the functionality and only available in
+5.10. @code{H::U::F::Compat} is available for pre-5.10, but it is too slow to
+use.")
+  (license (package-license perl))))
+
 (define-public perl-hash-merge
   (package
     (name "perl-hash-merge")
@@ -3505,29 +3949,83 @@ easier to develop interactive applications: is_interactive(), interactive(),
 and busy().")
     (license (package-license perl))))
 
-(define-public perl-io-string
+(define-public perl-io-pager
   (package
-    (name "perl-io-string")
-    (version "1.08")
+    (name "perl-io-pager")
+    (version "0.37")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/G/GA/GAAS/"
-                           "IO-String-" version ".tar.gz"))
+       (uri (string-append
+             "mirror://cpan/authors/id/J/JP/JPIERCE/IO-Pager-"
+             version
+             ".tgz"))
        (sha256
         (base32
-         "18755m410yl70s17rgq3m0hyxl8r5mr47vsq1rw7141d8kc4lgra"))))
+         "0xmqyyvm06d26l2pyh874343b1hjmimdx1ff2r66f1h34yv759fg"))))
     (build-system perl-build-system)
-    (home-page "http://search.cpan.org/~gaas/IO-String-1.08/")
-    (synopsis "Emulate file interface for in-core strings")
-    (description "IO::String is an IO::File (and IO::Handle) compatible class
-that reads or writes data from in-core strings.")
+    (inputs
+     `(("perl-file-which" ,perl-file-which)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'set-pager
+                     (lambda* (#:key inputs #:allow-other-keys)
+                       (setenv "PAGER" "cat"))))))
+    (home-page
+     "http://search.cpan.org/dist/IO-Pager")
+    (synopsis
+     "Select a pager and pipe text to it if destination is a TTY")
+    (description "@code{IO::Pager} can be used to locate an available pager and
+set the PAGER environment variable. It is also a factory for creating I/O
+objects such as @code{IO::Pager::Buffered} and @code{IO::Pager::Unbuffered}.")
     (license (package-license perl))))
 
 (define-public perl-io-stringy
   (package
     (name "perl-io-stringy")
-    (version "2.110")
+    (version "2.111")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/D/DS/DSKOLL/"
+             "IO-Stringy-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0c437zvzpqi8f0h3nmblwdi2bvsb92b7g30fndr7my9qnky35izw"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/IO-stringy")
+    (synopsis "Write a file which is updated atomically")
+    (description "This toolkit primarily provides modules for performing both
+traditional and object-oriented i/o) on things *other* than normal
+filehandles; in particular, @code{IO::Scalar}, @code{IO::ScalarArray}, and
+@code{IO::Lines}.")
+    (license (package-license perl))))
+
+(define-public perl-io-string
+  (package
+    (name "perl-io-string")
+    (version "1.08")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/G/GA/GAAS/"
+                           "IO-String-" version ".tar.gz"))
+       (sha256
+        (base32
+         "18755m410yl70s17rgq3m0hyxl8r5mr47vsq1rw7141d8kc4lgra"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/~gaas/IO-String-1.08/")
+    (synopsis "Emulate file interface for in-core strings")
+    (description "IO::String is an IO::File (and IO::Handle) compatible class
+that reads or writes data from in-core strings.")
+    (license (package-license perl))))
+
+(define-public perl-io-stringy
+  (package
+    (name "perl-io-stringy")
+    (version "2.110")
     (source
      (origin
        (method url-fetch)
@@ -3559,7 +4057,7 @@ filehandles; in particular, IO::Scalar, IO::ScalarArray, and IO::Lines.")
     (home-page "http://search.cpan.org/~toddr/IO-Tty/")
     (synopsis "Perl interface to pseudo ttys")
     (description
-     "This package provides the 'IO::Pty' and 'IO::Tty' Perl interfaces to
+     "This package provides the @code{IO::Pty} and @code{IO::Tty} Perl interfaces to
 pseudo ttys.")
     (license (package-license perl))))
 
@@ -3778,6 +4276,28 @@ either uses the first module it finds or throws an error.")
 versa.")
     (license (package-license perl))))
 
+(define-public perl-libintl-perl
+  (package
+    (name "perl-libintl-perl")
+    (version "1.26")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/G/GU/GUIDO/"
+             "libintl-perl-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0l1y0pw8k4zy703kwbrhjmmjlc2x96camdkbz4n8bhi4v2lyla1z"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-file-sharedir" ,perl-file-sharedir)))
+    (home-page "http://search.cpan.org/dist/libintl-perl")
+    (synopsis "High-Level Interface to Uniforum Message Translation")
+    (description "@code{List::SomeUtils} provides some trivial but commonly
+portions of this module couldn't be compiled on this machine.")
+    (license license:gpl3)))
+
 (define-public perl-log-any
   (package
     (name "perl-log-any")
@@ -4970,6 +5490,257 @@ all coercions and constraints are inherited.")
 constraint with coercion to load the class.")
     (license (package-license perl))))
 
+(define-public perl-moox
+(package
+  (name "perl-moox")
+  (version "0.101")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/G/GE/GETTY/MooX-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1m9jvrqcidiabdih211byadwnnkygafq54r2ljnf1akqdrjimy9g"))))
+  (build-system perl-build-system)
+  (inputs
+    `(("perl-data-optlist" ,perl-data-optlist)
+      ("perl-import-into" ,perl-import-into)
+      ("perl-module-runtime" ,perl-module-runtime)
+      ("perl-moo" ,perl-moo)))
+  (home-page "http://search.cpan.org/dist/MooX")
+  (synopsis
+    "Using Moo and MooX:: packages the most lazy way")
+  (description "Using Moo and MooX:: packages the most lazy way.")
+  (license (package-license perl))))
+
+(define-public perl-moox-cmd
+(package
+  (name "perl-moox-cmd")
+  (version "0.015")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/R/RE/REHSACK/MooX-Cmd-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "0145ha8vnc6sbg82ps96wj716bznq2qamm657bia9ji2yxhbnsam"))))
+  (build-system perl-build-system)
+  (native-inputs
+    `(("perl-capture-tiny" ,perl-capture-tiny)
+      ("perl-list-moreutils" ,perl-list-moreutils)))
+  (inputs
+    `(("perl-module-pluggable" ,perl-module-pluggable)
+      ("perl-module-runtime" ,perl-module-runtime)
+      ("perl-moo" ,perl-moo)
+      ("perl-package-stash" ,perl-package-stash)
+      ("perl-params-util" ,perl-params-util)
+      ("perl-regexp-common" ,perl-regexp-common)))
+  (arguments
+   '(#:phases
+     (modify-phases %standard-phases
+       (add-before 'check 'fix-envvar
+                   (lambda* (#:key inputs #:allow-other-keys)
+                           (setenv "PERL5LIB"
+                                   (string-append
+                                    (assoc-ref inputs "perl-list-moreutils")
+                                    ":" (getenv "PERL5LIB"))))))
+     #:tests? #f)) ; Error:  Could not find sub 'first_result'
+                   ; exported by List::MoreUtils
+  (home-page
+    "http://search.cpan.org/dist/MooX-Cmd")
+  (synopsis
+    "Giving an easy Moo style way to make command organized CLI apps")
+  (description "Eases the writing of command line utilities, accepting
+commands and subcommands and so on. These commands can form a tree, which is
+mirrored in the package structure. On invocation each command along the path
+through the tree (starting from the toplevel command through to the most
+specific one) is instanciated.")
+  (license (package-license perl))))
+
+(define-public perl-moox-configfromfile
+  (package
+    (name "perl-moox-configfromfile")
+    (version "0.007")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/R/RE/REHSACK/"
+                           "MooX-ConfigFromFile-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0qq1vlcrnhgisww3ddzbc3y96y87ij5r6rggx38aqcsd3v89pcqm"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-hash-merge" ,perl-hash-merge)
+       ("perl-json" ,perl-json)
+       ("perl-moox-cmd" ,perl-moox-cmd)))
+;       ("perl-moox-options" ,perl-moox-options))) ; hangs
+    (inputs
+     `(("perl-config-any" ,perl-config-any)
+       ("perl-file-configdir" ,perl-file-configdir)
+       ("perl-file-find-rule" ,perl-file-find-rule)
+       ("perl-hash-merge" ,perl-hash-merge)
+       ("perl-moo", perl-moo)
+       ("perl-moox-file-configdir" ,perl-moox-file-configdir)
+       ("perl-namespace-clean" ,perl-namespace-clean)))
+    (home-page "http://search.cpan.org/dist/MooX-ConfigFromFile")
+    (synopsis "Moo eXtension for initializing objects from config file")
+    (description "This module is intended to easy load initialization values
+for attributes on object construction from an appropriate config file. The
+building is done in @code{MooX::ConfigFromFile::Role} - using
+@code{MooX::ConfigFromFile} ensures the role is applied.")
+    (license (package-license perl))))
+
+(define-public perl-moox-file-configdir
+  (package
+    (name "perl-moox-file-configdir")
+    (version "0.005")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/R/RE/RESHACK/"
+                           "MooX-File-ConfigDir-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1vvmgygv1i6n98wp26x1112asmwrpy6v089j46l88if3lc6zk3l8"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-file-configdir" ,perl-file-configdir)
+       ("perl-moo-role" ,perl-moo)
+       ("perl-namespace-clean" ,perl-namespace-clean)))
+    (home-page "http://search.cpan.org/dist/MooX-File-ConfigDir")
+    (synopsis "Moo eXtension for @code{File::ConfigDir}")
+    (description "This module is a helper for easily find configuration file
+locations. Whether to use this information for find a suitable place for
+installing them or looking around for finding any piece of settings, heavily
+depends on the requirements.")
+    (license (package-license perl))))
+
+(define-public perl-moox-handlesvia
+  (package
+    (name "perl-moox-handlesvia")
+    (version "0.001008")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/M/MA/MATTP/"
+                           "MooX-HandlesVia-" version ".tar.gz"))
+       (sha256
+        (base32
+         "137yrjn2jmw4cj0fjdajnkjgqr5arnpq72kbm6w66xskncinz55h"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-moox-types-mooselike" ,perl-moox-types-mooselike)
+       ("perl-test-exception" ,perl-test-exception)
+       ("perl-test-fatal" ,perl-test-fatal)))
+    (inputs
+     `(("perl-data" ,perl-data)
+       ("perl-list-moreutils" ,perl-list-moreutils)
+       ("perl-class-method-modifiers" ,perl-class-method-modifiers)
+       ("perl-module-runtime" ,perl-module-runtime)
+       ("perl-moo" ,perl-moo)
+       ("perl-role-tiny" ,perl-role-tiny)))
+    (home-page "http://search.cpan.org/dist/MooX-HandlesVia")
+    (synopsis "NativeTrait-like behavior for Moo")
+    (description "Extension of Moo's 'handles' attribute functionality. It
+provides a means of proxying functionality from an external class to the given
+atttribute. This is most commonly used as a way to emulate 'Native Trait'
+behavior that has become commonplace in Moose code, for which there was no Moo
+alternative.")
+    (license (package-license perl))))
+
+(define-public perl-moox-late
+  (package
+    (name "perl-moox-late")
+    (version "0.015")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/T/TO/TOBYINK/MooX-late-"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "1gzvd9zws3v09sh0xx6srmw4jwi22fnrya4zcsc8dykn62pjclqp"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-requires" ,perl-test-requires)
+       ("perl-test-fatal" ,perl-test-fatal)))
+    (inputs
+     `(("perl-data" ,perl-data)
+       ("perl-moo" ,perl-moo)
+       ("perl-moosex-types" ,perl-moosex-types)
+       ("perl-moox" ,perl-moox)
+       ("perl-moox-handlesvia" ,perl-moox-handlesvia)
+       ("perl-type-tiny" ,perl-type-tiny)))
+    (home-page "http://search.cpan.org/dist/MooX-late")
+    (synopsis "Easily translate Moose code to Moo")
+    (description "Moo is a light-weight object oriented programming framework
+which aims to be compatible with Moose. It does this by detecting when Moose
+has been loaded, and automatically \"inflating\" its classes and roles to full
+Moose classes and roles. This way, Moo classes can consume Moose roles, Moose
+classes can extend Moo classes, and so forth.")
+    (license perl-license)))
+
+(define-public perl-moox-options
+  (package
+    (name "perl-moox-options")
+    (version "4.023")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/C/CE/CELOGEEK/"
+                           "MooX-Options-" version ".tar.gz"))
+       (sha256
+        (base32
+         "14kz51hybxx8vcm4wg36f0qa64aainw7i2sqmqxg20c3qvczyvj2"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-capture-tiny" ,perl-capture-tiny)
+       ("perl-import-into" ,perl-import-into)
+       ("perl-module-build" ,perl-module-build)
+;       ("perl-mo" ,perl-mo) ; not packaged
+       ("perl-moo" ,perl-moo)
+       ("perl-moose" ,perl-moose)
+;       ("perl-moox-cmd" ,perl-moox-cmd) ; hangs
+       ("perl-namespace-clean" ,perl-namespace-clean)
+       ("perl-role-tiny" ,perl-role-tiny)
+       ("perl-test-requires" ,perl-test-requires)
+       ("perl-test-trap" ,perl-test-trap)
+       ("perl-test-pod" ,perl-test-pod)
+       ("perl-try-tiny" ,perl-try-tiny)))
+    (inputs
+     `(("perl-config-any" ,perl-config-any)
+       ("perl-moox-configfromfile" ,perl-moox-configfromfile)
+       ("perl-data-record" ,perl-data-record)
+       ("perl-file-configdir" ,perl-file-configdir)
+       ("perl-file-find-rule" ,perl-file-find-rule)
+       ("perl-file-sharedir" ,perl-file-sharedir)
+       ("perl-getopt-long-descriptive" ,perl-getopt-long-descriptive)
+       ("perl-json-maybexs" ,perl-json-maybexs)
+       ("perl-libintl-perl" ,perl-libintl-perl)
+       ("perl-moox-configfromfile" ,perl-moox-configfromfile)
+       ("perl-moox-file-configdir" ,perl-moox-file-configdir)
+       ("perl-path-class" ,perl-path-class)
+       ("perl-regexp-common" ,perl-regexp-common)
+       ("perl-term-size-any" ,perl-term-size-any)
+       ("perl-unicode-linebreak" ,perl-unicode-linebreak)))
+    (home-page "http://search.cpan.org/dist/MooX-Options")
+    (synopsis "Explicit Options eXtension for Object Class")
+    (description "Create a command line tool with your Mo, Moo, Moose objects.
+
+Everything is explicit.  You have an option keyword to replace the usual has
+to explicitly use your attribute into the command line.
+
+The option keyword takes additional parameters and uses
+@code{Getopt::Long::Descriptive} to generate a command line tool.")
+    (license (package-license perl))))
+
 (define-public perl-moox-types-mooselike
   (package
     (name "perl-moox-types-mooselike")
@@ -5148,6 +5919,61 @@ cycle.  Functions called in the package itself will still be bound by their
 name, but they won't show up as methods on your class or instances.")
     (license (package-license perl))))
 
+(define-public perl-net-dbus
+(package
+  (name "perl-net-dbus")
+  (version "1.1.0")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/D/DA/DANBERR/Net-DBus-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "0sg2w147b9r9ykfzjs7y9qxry73xkjnhnk4qf95kfv79p5nnk4c3"))))
+  (build-system perl-build-system)
+  (native-inputs
+   `(("pkg-config" ,pkg-config)
+     ("perl-cpan-changes" ,perl-cpan-changes)
+     ("perl-test-pod" ,perl-test-pod)
+     ("perl-test-pod-coverage" ,perl-test-pod-coverage)))
+  (inputs
+   `(("dbus" ,dbus)
+     ("perl-xml-parser" ,perl-xml-parser)
+     ("perl-xml-twig" ,perl-xml-twig)))
+  (home-page
+    "http://search.cpan.org/dist/Net-DBus")
+  (synopsis "Extension for the DBus bindings")
+  (description "Net::DBus provides a Perl API for the DBus message system. The
+DBus Perl interface is currently operating against the 0.32 development
+version of DBus, but should work with later versions too, providing the API
+changes have not been too drastic.")
+  (license perl-license)))
+
+(define-public perl-net-dbus-glib
+  (package
+    (name "perl-net-dbus-glib")
+    (version "0.33.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/D/DA/DANBERR/"
+                           "Net-DBus-GLib-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1z4mbv8z0rad604xahijpg5szzi8qak07hbahh230z4jf96fkxvj"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("dbus-glib" ,dbus-glib)))
+    (home-page "http://search.cpan.org/~danberr/Net-DBus-GLib-0.33.0/")
+    (synopsis "Perl extension for the DBus GLib bindings")
+    (description "Provides an extension to the @code{Net::DBus} module allowing integration with the GLib mainloop.  To integrate with the main loop, simply get a connection to the bus via the methods in @code{Net::DBus::GLib} rather than the usual @code{Net::DBus} module.  That's it - every other API remains the same.")
+    (license (list gpl2+ perl-license))))
+
 (define-public perl-net-statsd
   (package
    (name "perl-net-statsd")
@@ -5618,6 +6444,45 @@ Module::Build project, but has been externalized here for general use.")
                               "Probe-Perl-" version))
     (license (package-license perl))))
 
+(define-public perl-proc-invokeeditor
+  (package
+  (name "perl-proc-invokeeditor")
+  (version "1.07")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/M/MS/MSTEVENS/Proc-InvokeEditor-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1ahc41s06bbq9y37706qci5k89fbnspmyldlb8srlaqibsqqm37x"))))
+  (build-system perl-build-system)
+  (inputs
+   `(("perl-carp-assert" ,perl-carp-assert)))
+  (arguments
+   '(#:tests? #f)) ; Needs an editor
+  (home-page
+    "http://search.cpan.org/dist/Proc-InvokeEditor")
+  (synopsis
+    "Interface to external editor from perl")
+  (description "This module provides the ability to supply some text to an
+external text editor, have it edited by the user, and retrieve the results.
+
+The @code{File::Temp} module is used to provide secure, safe temporary files,
+and @code{File::Temp} is set to its highest available level of security.  This
+may cause problems on some systems where no secure temporary directory is
+available.
+
+When the editor is started, no subshell is used.  Your path will be scanned to
+find the binary to use for each editor if the string given does not exist as a
+file, and if a named editor contains whitespace, eg) if you try to use the
+editor xemacs -nw, then the string will be split on whitespace and anything
+after the editor name will be passed as arguments to your editor.  A shell is
+not used but this should cover most simple cases.")
+  (license (package-license perl))))
+
 (define-public perl-readonly
   (package
     (name "perl-readonly")
@@ -5665,29 +6530,6 @@ codes.")
     ;; Quad-licensed: Perl Artistic, Perl Artistic 2.0, X11, and BSD.
     (license (list (package-license perl) x11 bsd-3))))
 
-(define-public perl-role-tiny
-  (package
-    (name "perl-role-tiny")
-    (version "1.003004")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/H/HA/HAARG/"
-                           "Role-Tiny-" version ".tar.gz"))
-       (sha256
-        (base32
-         "0ak60hakn0ixmsiw403si0lf5pagq5r6wjgl7p0pr979nlcikfmd"))))
-    (build-system perl-build-system)
-    (native-inputs
-     `(("perl-namespace-autoclean" ,perl-namespace-autoclean)
-       ("perl-test-fatal" ,perl-test-fatal)))
-    (propagated-inputs
-     `(("perl-class-method-modifiers" ,perl-class-method-modifiers)))
-    (home-page "http://search.cpan.org/dist/Role-Tiny")
-    (synopsis "Roles, as a slice of Moose")
-    (description "Role::Tiny is a minimalist role composition tool.")
-    (license (package-license perl))))
-
 (define-public perl-safe-isa
   (package
     (name "perl-safe-isa")
@@ -5811,6 +6653,28 @@ compact.")
 arrays by one or multiple calculated keys.")
     (license (package-license perl))))
 
+(define-public perl-sort-naturally
+  (package
+  (name "perl-sort-naturally")
+  (version "1.03")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/B/BI/BINGOS/Sort-Naturally-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "0ip7q5g8d3lr7ri3ffcbrpk1hzzsiwgsn14k10k7hnjphxf1raza"))))
+  (build-system perl-build-system)
+  (home-page
+    "http://search.cpan.org/dist/Sort-Naturally")
+  (synopsis
+    "Sort lexically, but sort numeral parts numerically")
+  (description "This module exports two functions, @code{nsort} and @code{ncmp}; they are used in implementing my idea of a \"natural sorting\" algorithm.  Under natural sorting, numeric substrings are compared numerically, and other word-characters are compared lexically.")
+  (license (package-license perl))))
+
 (define-public perl-spiffy
   (package
     (name "perl-spiffy")
@@ -6331,6 +7195,79 @@ other terminal related features, including retrieval/modification of the
 screen size, and retrieval/modification of the control characters.")
     (license (package-license perl))))
 
+(define-public perl-term-size-any
+  (package
+    (name "perl-term-size-any")
+    (version "0.002")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/F/FE/FERREIRA/"
+                           "Term-Size-Any-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1lnynd8pwjp3g85bl4nav6yigg2lag3sx5da989j7a733bdmzyk4"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-devel-hide" ,perl-devel-hide)
+       ("perl-term-size-perl" ,perl-term-size-perl)))
+    (home-page "http://search.cpan.org/dist/Term-Size-Any")
+    (synopsis "Retrieve terminal size")
+    (description "This is a unified interface to retrieve terminal size.  It
+loads one module of a list of known alternatives, each implementing some way
+to get the desired terminal information.  This loaded module will actually do
+the job on behalf of @code{Term::Size::Any}.")
+    (license (package-license perl))))
+
+(define-public perl-term-size-perl
+  (package
+    (name "perl-term-size-perl")
+    (version "0.029")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/F/FE/FERREIRA/"
+                           "Term-Size-Perl-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1rvm91bhdlxfwx5zka023p7szf2s7gm16wl27qiivvj66svsl6lc"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/Term-Size-Perl")
+    (synopsis "Perl extension for retrieving terminal size (Perl version)")
+    (description "Yet another implementation of @code{Term::Size}.  Now in
+pure Perl, with the exception of a C probe run on build time.")
+    (license (package-license perl))))
+
+(define-public perl-termreadkey
+  (package
+    (name "perl-termreadkey")
+    (version "2.14")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/K/KJ/KJALB/TermReadKey-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1a69ainw5z8i6kmk1yh4rbqm4l6fga29kbvqv808r7w8v661a2b0"))))
+    (build-system perl-build-system)
+    (arguments
+     '(#:tests? #f))                    ; Needs terminal
+    (home-page
+     "http://search.cpan.org/dist/TermReadKey")
+    (synopsis
+     "A perl module for simple terminal control")
+    (description "@code{Term::ReadKey} is a compiled perl module dedicated to
+providing simple control over terminal driver modes (cbreak, raw, cooked,
+etc.,) support for non-blocking reads, if the architecture allows, and some
+generalized handy functions for working with terminals.  One of the main goals
+is to have the functions as portable as possible, so you can just plug in
+\"use Term::ReadKey\" on any architecture and have a good likelihood of it
+working.")
+    (license (package-license perl))))
+
 (define-public perl-test-base
   (package
     (name "perl-test-base")
@@ -6989,6 +7926,35 @@ makes fork(2) safe to use in test cases.")
                               "Test-Simple-" version))
     (license (package-license perl))))
 
+(define-public perl-test-taint
+  (package
+    (name "perl-test-taint")
+    (version "1.06")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/P/PE/PETDANCE/Test-Taint-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "01rip5d7gdr1c7lq6yczzkqfd0500nfa977ryigylj6jj75526vj"))))
+    (build-system perl-build-system)
+    (home-page
+     "http://search.cpan.org/dist/Test-Taint")
+    (synopsis "Checks for taintedness of variables")
+    (description "Tainted data is data that comes from an unsafe source, such as
+the command line, or, in the case of web apps, any GET or POST transactions.
+Read the perlsec man page for details on why tainted data is bad, and how to
+untaint the data.
+
+When you're writing unit tests for code that deals with tainted data, you'll
+want to have a way to provide tainted data for your routines to handle, and
+easy ways to check and report on the taintedness of your data, in standard
+@code{Test::More} style.")
+    (license (package-license perl))))
+
 (define-public perl-test-tester
   (package
     (name "perl-test-tester")
@@ -7690,6 +8656,97 @@ that are designed to minimize common mistakes with eval blocks, and nothing
 else.")
     (license x11)))
 
+(define-public perl-type-tie
+  (package
+  (name "perl-type-tie")
+  (version "0.009")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/T/TO/TOBYINK/Type-Tie-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1wv32kd7gx4kfyvzs13y029f49qbbji991wawvarac7rlz09wpan"))))
+  (build-system perl-build-system)
+  (native-inputs
+    `(("perl-test-fatal" ,perl-test-fatal)
+      ("perl-test-requires" ,perl-test-requires)))
+  (inputs
+    `(("perl-exporter-tiny" ,perl-exporter-tiny)
+      ("perl-hash-fieldhash" ,perl-hash-fieldhash)))
+  (home-page
+    "http://search.cpan.org/dist/Type-Tie")
+  (synopsis "tie a variable to a type constraint")
+  (description "This module exports a single function: @code{ttie}. ttie ties a variable to a type constraint, ensuring that whatever values stored in the variable will conform to the type constraint. If the type constraint has coercions, these will be used if necessary to ensure values assigned to the variable conform.")
+  (license (package-license perl))))
+
+(define-public perl-type-tiny
+  (package
+    (name "perl-type-tiny")
+    (version "1.000006")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/T/TO/TOBYINK/"
+                           "Type-Tiny-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0wn0pf3kzfdaa1ygj8gc1qjfifs5rf21a7xzgvr6hmavwfgs6qdw"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-warnings" ,perl-test-warnings)))
+    (inputs
+     `(("perl-devel-lexalias" ,perl-devel-lexalias)
+       ("perl-devel-stacktrace" ,perl-devel-stacktrace)
+       ("perl-exporter-tiny" ,perl-exporter-tiny)
+       ("perl-moo" ,perl-moo)
+       ("perl-moose" ,perl-moose)
+       ("perl-mouse" ,perl-mouse)
+       ("perl-reply" ,perl-reply)
+       ("perl-sub-name" ,perl-sub-name)
+       ("perl-type-tie" ,perl-type-tie)
+       ("perl-type-tiny-xs" ,perl-type-tiny-xs)))
+    (home-page "http://search.cpan.org/dist/Type-Tiny")
+    (synopsis "Tiny, yet Moo(se)-compatible type constraint")
+    (description "@code{Type::Tiny} is a tiny class for creating Moose-like
+type constraint objects which are compatible with Moo, Moose and Mouse.
+
+Maybe now we won't need to have separate MooseX, MouseX and MooX versions of
+everything? We can but hope...
+
+This documents the internals of @code{Type::Tiny}. @code{Type::Tiny::Manual}
+is a better starting place if you're new.")
+    (license perl-license)))
+
+(define-public perl-type-tiny-xs
+  (package
+    (name "perl-type-tiny-xs")
+    (version "0.012")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/T/TO/TOBYINK/Type-Tiny-XS-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "05nbr898cvjjh1wsy55l84zasx65gijdxc6dnn558ihns8zx6gm9"))))
+    (build-system perl-build-system)
+    (home-page
+     "http://search.cpan.org/dist/Type-Tiny-XS")
+    (synopsis
+     "Provides an XS boost for some of @code{Type::Tiny}'s built-in type constraints")
+    (description "This module is optionally used by @code{Type::Tiny} 0.045_03 and
+above to provide faster, C-based implementations of some type
+constraints. (This package has only core dependencies, and does not depend on
+@code{Type::Tiny}, so other data validation frameworks might also consider using
+it!)")
+    (license perl-license)))
+
 (define-public perl-types-serialiser
   (package
     (name "perl-types-serialiser")
@@ -7750,7 +8807,7 @@ common serialisation formats such as JSON or CBOR.")
 Unicode data.")
     ;; The file Unicode/Collate/allkeys.txt is released under the Expat
     ;; license.
-    (license (list (package-license perl) expat))))
+    (license (list (package-license perl) license:expat))))
 
 (define-public perl-unicode-linebreak
   (package
@@ -8102,6 +9159,90 @@ system---most of the @code{Module::Build} code is pure-Perl.")
 files, using JSON::PP and/or CPAN::Meta::YAML.")
     (license (package-license perl))))
 
+(define-public perl-reply
+  (package
+    (name "perl-reply")
+    (version "0.42")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/D/DO/DOY/Reply-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1wkrmc1ksy4zdribj305mmwmsvc2x9283979qh8awm3slx2jmnja"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-app-nopaste" ,perl-app-nopaste)
+       ("perl-b-keywords" ,perl-b-keywords)
+       ("perl-carp-always" ,perl-carp-always)
+       ("perl-class-refresh" ,perl-class-refresh)
+       ("perl-config-ini" ,perl-config-ini)
+       ("perl-config-ini-reader-ordered"
+        ,perl-config-ini-reader-ordered)
+       ("perl-data-dump" ,perl-data-dump)
+       ("perl-data-printer" ,perl-data-printer)
+       ("perl-devel-lexalias" ,perl-devel-lexalias)
+       ("perl-eval-closure" ,perl-eval-closure)
+       ("perl-file-homedir" ,perl-file-homedir)
+       ("perl-io-pager" ,perl-io-pager)
+       ("perl-mixin-linewise" ,perl-mixin-linewise)
+       ("perl-module-runtime" ,perl-module-runtime)
+       ("perl-package-stash" ,perl-package-stash)
+       ("perl-padwalker" ,perl-padwalker)
+       ("perl-perlio-utf8_strict" ,perl-perlio-utf8_strict)
+       ("perl-sub-exporter" ,perl-sub-exporter)
+       ("perl-proc-invokeeditor"
+        ,perl-proc-invokeeditor)
+       ;("perl-term-readline-gnu" ; unable to build
+       ; ,perl-term-readline-gnu)
+       ("perl-termreadkey" ,perl-termreadkey)
+       ("perl-try-tiny" ,perl-try-tiny)))
+    (home-page "http://search.cpan.org/dist/Reply")
+    (synopsis "read, eval, print, loop, yay!")
+    (description "Reply is a lightweight, extensible REPL for Perl. It is
+plugin-based (see @code{Reply::Plugin}), and through plugins supports many
+advanced features such as coloring and pretty printing, readline support, and
+pluggable commands.")
+    (license x11)))
+
+(define-public perl-role-tiny
+  (package
+    (name "perl-role-tiny")
+    (version "2.000005")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/H/HA/HAARG/"
+                           "Role-Tiny-" version ".tar.gz"))
+       (sha256
+        (base32
+         "059i0rq0rzbamsnyxba9zhm51v7nzmfls5fh301byag046v2jfjr"))))
+    (build-system perl-build-system)
+    (propagated-inputs
+     `(("perl-cpan-meta-yaml" ,perl-cpan-meta-yaml)))
+    (home-page "http://search.cpan.org/dist/Role-Tiny")
+    (synopsis "Like a nouvelle cuisine portion size slice of Moose")
+    (description "A minimalist role composition tool.
+
+Role composition can be thought of as much more clever and meaningful multiple
+inheritance.  The basics of this implementation of roles is:
+
+    If a method is already defined on a class, that method will not be
+composed in from the role. A method inherited by a class gets overridden by
+the role's method of the same name, though.  If a method that the role
+\"requires\" to be implemented is not implemented, role application will fail
+loudly.
+
+Unlike Class::C3, where the last class inherited from \"wins,\" role
+composition is the other way around, where the class wins.  If multiple roles
+are applied in a single call (single with statement), then if any of their
+provided methods clash, an exception is raised unless the class provides a
+method since this conflict indicates a potential problem.")
+    (license (package-license perl))))
+
 (define-public perl-scalar-list-utils
   (package
     (name "perl-scalar-list-utils")
@@ -8146,6 +9287,40 @@ such that being individual extensions would be wasteful.")
       "Shell::Command is a thin wrapper around ExtUtils::Command.")
     (license (package-license perl))))
 
+(define-public perl-strictures
+  (package
+    (name "perl-strictures")
+    (version "2.000003")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append
+              "mirror://cpan/authors/id/H/HA/HAARG/"
+              "strictures-" version ".tar.gz"))
+        (sha256
+          (base32
+            "08mgvf1d2651gsg3jgjfs13878ndqa4ji8vfsda9f7jjd84ymy17"))))
+    (build-system perl-build-system)
+    (home-page
+      "http://search.cpan.org/dist/strictures")
+    (synopsis
+      "Turn on strict and make most warnings fatal")
+    (description
+      "Things like the importer in use Moose don't help me because they turn
+warnings on but don't make them fatal -- which from my point of view is
+useless because I want an exception to tell me my code isn't warnings-clean.
+
+Any time I see a warning from my code, that indicates a mistake.
+
+Any time my code encounters a mistake, I want a crash -- not spew to STDERR
+and then unknown (and probably undesired) subsequent behaviour.
+
+I also want to ensure that obvious coding mistakes, like indirect object
+syntax (and not so obvious mistakes that cause things to accidentally compile
+as such) get caught, but not at the cost of an XS dependency and not at the
+cost of blowing things up on another machine.")
+    (license (package-license perl))))
+
 ;;; END: Core module overrides
 
 (define-public perl-file-find-object
@@ -8235,3 +9410,36 @@ interface to File::Find::Object.")
   (description "Test::TrailingSpace tests for trailing spaces
 in Perl source files.")
   (license x11)))
+
+(define-public perl-types-path-tiny
+ (package
+  (name "perl-types-path-tiny")
+  (version "0.005")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+            "mirror://cpan/authors/id/D/DA/DAGOLDEN/"
+            "Types-Path-Tiny-" version ".tar.gz"))
+      (sha256
+        (base32
+          "09nf167ssi4rgj8hhzylwp3zdx61njdpyfri43arcmk9aqn7f0pp"))))
+  (build-system perl-build-system)
+  (native-inputs
+   `(("perl-file-pushd" ,perl-file-pushd)
+     ("perl-path-tiny" ,perl-path-tiny)
+     ("perl-type-tiny" ,perl-type-tiny)
+     ("perl-exporter-tiny" ,perl-exporter-tiny)))
+  (home-page
+    "http://search.cpan.org/dist/Types-Path-Tiny")
+  (synopsis
+    "Types and coercions for Moose and Moo")
+  (description "This module provides @code{Path::Tiny} types for Moose, Moo, etc.
+
+It handles two important types of coercion:
+@enumerate
+@item    coercing objects with overloaded stringification
+@item    coercing to absolute paths
+@end enumerate
+It also can check to ensure that files or directories exist.")
+  (license artistic2.0)))
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 8abd4309d..cf8d3be1d 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -19,6 +19,7 @@
 ;;; Copyright © 2016 Bake Timmons <[email-masked]>
 ;;; Copyright © 2017 Thomas Danckaert <[email-masked]>
 ;;; Copyright © 2017 Marius Bakke <[email-masked]>
+;;; Copyright © 2017 Petter <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -74,6 +75,7 @@
   #:use-module (gnu packages image)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages lua)
+  #:use-module (gnu packages moreutils)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages base)
   #:use-module (gnu packages perl)
@@ -981,6 +983,55 @@ language known as SASS.")
 to perl-code, for faster generation of access_log lines.")
     (license l:perl-license)))
 
+(define-public perl-app-nopaste
+  (package
+    (name "perl-app-nopaste")
+    (version "1.009")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/E/ET/ETHER/App-Nopaste-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0yz1mfjnnvpxpydcgzmkravd9ixsg86q07g6f4mm3ylkpk9bsr0l"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-libwww" ,perl-libwww)
+       ("perl-test-deep" ,perl-test-deep)
+       ("perl-test-fatal" ,perl-test-fatal)))
+    (inputs
+     `(("perl-browser-open" ,perl-browser-open)
+       ("perl-class-load" ,perl-class-load)
+       ("perl-clipboard" ,perl-clipboard)
+       ("perl-getopt-long-descriptive"
+        ,perl-getopt-long-descriptive)
+       ("perl-html-form" ,perl-html-form)
+       ("perl-json-maybexs" ,perl-json-maybexs)
+       ("perl-module-pluggable" ,perl-module-pluggable)
+       ("perl-module-runtime" ,perl-module-runtime)
+       ("perl-namespace-clean" ,perl-namespace-clean)
+       ("perl-path-tiny" ,perl-path-tiny)
+       ("perl-sub-name" ,perl-sub-name)
+       ("perl-uri" ,perl-uri)
+       ("perl-www-mechanize" ,perl-www-mechanize)
+       ("perl-yaml" ,perl-yaml)
+       ("perl-www-pastebin-pastebincom-create"
+        ,perl-www-pastebin-pastebincom-create)))
+    (home-page
+     "http://search.cpan.org/dist/App-Nopaste")
+    (synopsis "Easy access to any pastebin")
+    (description "Pastebins (also known as nopaste sites) let you post text, usually code, for public viewing.  They're used a lot in IRC channels to show code that would normally be too long to give directly in the channel (hence the name nopaste).
+
+Each pastebin is slightly different.  When one pastebin goes down (I'm looking at you, http://paste.husk.org), then you have to find a new one.  And if you usually use a script to publish text, then it's too much hassle.
+
+This module aims to smooth out the differences between pastebins, and provides redundancy: if one site doesn't work, it just tries a different one.
+
+It's also modular: you only need to put on CPAN a @code{App::Nopaste::Service::Foo} module and anyone can begin using it.")
+    (license l:perl-license)))
+
 (define-public perl-authen-sasl
   (package
     (name "perl-authen-sasl")
@@ -2030,6 +2081,36 @@ Yahoo! Finance, Fidelity Investments, and the Australian Stock Exchange.")
 described in RFC 2744.")
     (license l:perl-license)))
 
+(define-public perl-html-form
+(package
+  (name "perl-html-form")
+  (version "6.03")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "mirror://cpan/authors/id/G/GA/GAAS/HTML-Form-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "0dpwr7yz6hjc3bcqgcbdzjjk9l58ycdjmbam9nfcmm85y2a1vh38"))))
+  (build-system perl-build-system)
+  (inputs
+    `(("perl-html-parser" ,perl-html-parser)
+      ("perl-http-message" ,perl-http-message)
+      ("perl-uri" ,perl-uri)))
+  (home-page
+    "http://search.cpan.org/dist/HTML-Form")
+  (synopsis
+    "Class that represents an HTML form element")
+  (description "Objects of the @code{HTML::Form} class represents a single
+HTML <form> ... </form> instance. A form consists of a sequence of inputs that
+usually have names, and which can take on various values. The state of a form
+can be tweaked and it can then be asked to provide @code{HTTP::Request}
+objects that can be passed to the request() method of @code{LWP::UserAgent}.")
+  (license l:perl-license)))
+
 (define-public perl-html-element-extended
   (package
     (name "perl-html-element-extended")
@@ -2634,6 +2715,42 @@ media types is defined by the media.types file.  If the ~/.media.types file
 exists it is used instead.")
     (home-page "http://search.cpan.org/~gaas/LWP-MediaTypes/")))
 
+(define-public perl-lwp-online
+  (package
+    (name "perl-lwp-online")
+    (version "1.08")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/A/AD/ADAMK/LWP-Online-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "176f6vbk1018i0y7xj9d406ndbjgwzan2j9nihxnsahzg2vr2vz2"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-libwww" ,perl-libwww)
+       ("perl-uri" ,perl-uri)))
+    (home-page
+     "http://search.cpan.org/dist/LWP-Online")
+    (synopsis
+     "Does your process have access to the web")
+    (description "This module attempts to answer, as accurately as it can, one
+of the nastiest technical questions there is.
+
+Am I on the internet?
+
+A host of networking and security issues make this problem very
+difficult.  There are firewalls, proxies (both well behaved and badly
+behaved).  We might not have DNS. We might not have a network card at all!
+
+You might have network access, but only to a for-money wireless network that
+responds to ever HTTP request with a page asking you to enter your credit card
+details for paid access.  Which means you don't \"REALLY\" have access.")
+    (license l:perl-license)))
+
 (define-public perl-lwp-protocol-https
   (package
     (name "perl-lwp-protocol-https")
@@ -3209,30 +3326,49 @@ library.")
 (define-public perl-www-mechanize
   (package
     (name "perl-www-mechanize")
-    (version "1.73")
+    (version "1.84")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/E/ET/ETHER/"
-                           "WWW-Mechanize-" version ".tar.gz"))
+       (uri (string-append
+             "mirror://cpan/authors/id/O/OA/OALDERS/WWW-Mechanize-"
+             version
+             ".tar.gz"))
        (sha256
         (base32
-         "1zrw8aadhwy48q51x2z2rqlkwf17bya4j4h3hy89mw783j96rmg9"))))
+         "06igfrd50la7csp9365g3i6gfans9y1hpwy2ln20lbny1arzvq0m"))))
     (build-system perl-build-system)
-    (native-inputs                      ;only for tests
-     `(("perl-cgi" ,perl-cgi)))
-    (propagated-inputs
+    (native-inputs
+     `(("perl-cgi" ,perl-cgi)
+       ("perl-http-daemon" ,perl-http-daemon)
+       ("perl-http-message" ,perl-http-message)
+       ("perl-http-server-simple"
+        ,perl-http-server-simple)
+       ("perl-libwww" ,perl-libwww)
+       ("perl-test-deep" ,perl-test-deep)
+       ("perl-test-exception" ,perl-test-exception)
+       ("perl-test-fatal" ,perl-test-fatal)
+       ("perl-test-needs" ,perl-test-needs)
+       ("perl-test-nowarnings" ,perl-test-nowarnings)
+       ("perl-test-output" ,perl-test-output)
+                                        ;      ("perl-test-requiresinternet"
+                                        ;       ,perl-test-requiresinternet)
+       ("perl-test-taint" ,perl-test-taint)
+       ("perl-test-warn" ,perl-test-warn)
+       ("perl-test-warnings" ,perl-test-warnings)
+       ("perl-uri" ,perl-uri)))
+    (inputs
      `(("perl-html-form" ,perl-html-form)
        ("perl-html-parser" ,perl-html-parser)
+       ("perl-html-tree" ,perl-html-tree)
+       ("perl-http-cookies" ,perl-http-cookies)
        ("perl-http-message" ,perl-http-message)
-       ("perl-http-server-simple" ,perl-http-server-simple)
        ("perl-libwww" ,perl-libwww)
-       ("perl-test-warn" ,perl-test-warn)
        ("perl-uri" ,perl-uri)))
-    (home-page "http://search.cpan.org/dist/WWW-Mechanize")
-    (synopsis "Web browsing in a Perl object")
-    (description "WWW::Mechanize is a Perl module for stateful programmatic
-web browsing, used for automating interaction with websites.")
+    (home-page
+     "http://search.cpan.org/dist/WWW-Mechanize")
+    (synopsis "Handy web browsing in a Perl object")
+    (description "@code{WWW::Mechanize}, or Mech for short, is a Perl module for stateful programmatic web browsing, used for automating interaction with websites.")
     (license l:perl-license)))
 
 (define-public perl-www-opensearch
@@ -3263,6 +3399,41 @@ web browsing, used for automating interaction with websites.")
 http://opensearch.a9.com} compatible search engines.")
     (license l:perl-license)))
 
+(define-public perl-www-pastebin-pastebincom-create
+  (package
+    (name "perl-www-pastebin-pastebincom-create")
+    (version "1.003")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/Z/ZO/ZOFFIX/WWW-Pastebin-PastebinCom-Create-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0xs29hilmlr51hcg4azbvi7c30yivan5gzwiq2z0dwrdy13lvcln"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-module-build" ,perl-module-build)))
+    (inputs
+     `(("perl-html-form" ,perl-html-form)
+       ("perl-http-message" ,perl-http-message)
+       ("perl-moo" ,perl-moo)
+       ("perl-libwww" ,perl-libwww)
+       ("perl-www-mechanize" ,perl-www-mechanize)))
+    (arguments
+     '(#:tests? #f)) ; 4 dependency levels down from what I'm trying to build >.<
+    (home-page
+     "http://search.cpan.org/dist/WWW-Pastebin-PastebinCom-Create")
+    (synopsis
+     "paste on www.pastebin.com without API keys")
+    (description "You kinda, sorta, maybe shouldn't really use this module. Use
+@code{WWW::Pastebin::PastebinCom::API} instead. Pastebin.com switched to a
+key-based API (which is what ::API version implements), and using this,
+keyless, module lets you paste only 10 pastes per day.")
+    (license l:artistic2.0)))
+
 (define-public perl-www-robotrules
   (package
     (name "perl-www-robotrules")
@@ -4439,6 +4610,88 @@ developers can integrate into their applications to make use of the
 functions of Tidy.")
     (license l:bsd-3)))
 
+(define-public tidyp
+  (package
+    (name "tidyp")
+    (version "1.04")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/downloads/petdance/tidyp/tidyp-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "0f5ky0ih4vap9c6j312jn73vn8m2bj69pl2yd3a5nmv35k9zmc10"))
+       (patches
+        (search-patches "tidyp-specify-test-files-in-makefile.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f)) ; Missing script
+    (home-page "http://www.tidyp.com/")
+    (synopsis "Validate HTML")
+    (description "Tidyp is a program that can validate your HTML, as well as
+modify it to be more clean and standard.  tidyp does not validate HTML 5.
+
+libtidyp is the library on which the program is based.  It can be used by any
+other program that can interface to it.  The Perl module @code{HTML::Tidy} is
+based on this library, allowing Perl programmers to easily validate HTML.")
+    (license (l:fsf-free "file://COPYRIGHT"))))
+
+(define-public perl-html-tidy
+  (package
+    (name "perl-html-tidy")
+    (version "1.56")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/P/PE/PETDANCE/HTML-Tidy-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1zp4wndvr9vadbqjmd8d8ck6hlmr0dqg20vpa8cqfdflqkzqf208"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-libwww" ,perl-libwww)
+       ("tidyp" ,tidyp)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'config 'patch-check
+                     (lambda* (#:key inputs #:allow-other-keys)
+                       (substitute* "Makefile.PL"
+                         (("-I/usr/include/tidyp")
+                          (string-append
+                           "-I" (assoc-ref inputs "tidyp") "/tidyp/include/")))))
+         (add-before 'build 'patch-check
+                     (lambda* (#:key inputs #:allow-other-keys)
+                       (substitute* "Tidy.xs"
+                         (("#include <tidyp.h>")
+                          (string-append "#include <"
+                                         (assoc-ref inputs "tidyp")
+                                         "/include/tidyp/tidyp.h>"))
+                         (("#include <buffio.h>")
+                          (string-append "#include <"
+                                         (assoc-ref inputs "tidyp")
+                                         "/include/tidyp/buffio.h>")))))
+         (add-after 'build 'update-include
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (substitute* "Tidy.c"
+                        (("#include <tidyp.h>")
+                         (string-append "#include <"
+                                        (assoc-ref inputs "tidyp")
+                                        "/include/tidyp/tidyp.h>"))))))
+       #:tests? #f))        ; Disabled because I was unable to fix it.
+    (home-page
+     "http://search.cpan.org/dist/HTML-Tidy")
+    (synopsis "(X)HTML validation in a Perl object")
+    (description "@code{HTML::Tidy} is an HTML checker in a handy dandy
+object.  It's meant as a replacement for [@code{HTML::Lint}] 1, which is
+written in Perl but is not nearly as capable as @code{HTML::Tidy}.")
+    (license l:artistic2.0)))
+
 (define-public hiawatha
   (package
     (name "hiawatha")
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index f4b68ba6a..a228817d2 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -15,6 +15,7 @@
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <[email-masked]>
 ;;; Copyright © 2016, 2017 Marius Bakke <[email-masked]>
 ;;; Copyright © 2017 humanitiesNerd <[email-masked]>
+;;; Copyright © 2017 Petter <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -305,6 +306,45 @@ to @code{XML::Parser} in much the same way that Gisle Aas'
 corresponding to an @code{XML::Parser} event.")
     (license license:perl-license)))
 
+(define-public perl-xml-twig
+  (package
+    (name "perl-xml-twig")
+    (version "3.52")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://cpan/authors/id/M/MI/MIROD/"
+                                  "XML-Twig-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1bc0hrz4jp6199hi29sdxmb9gyy45whla9hd19yqfasgq8k5ixzy"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("expat" ,expat)
+;       ("perl-cpan-meta-json" ,perl-cpan-meta-json)
+       ("perl-html-tidy" ,perl-html-tidy)
+       ("perl-html-tree" ,perl-html-tree)
+       ("perl-io-captureoutput" ,perl-io-captureoutput)
+       ("perl-io-string" ,perl-io-string)
+       ("perl-io-stringy" ,perl-io-stringy)
+       ("perl-libxml" ,perl-libxml)
+       ("perl-xml-filter-buffertext" ,perl-xml-filter-buffertext)
+       ("perl-xml-handler-yawriter" ,perl-xml-handler-yawriter)
+       ("perl-xml-parser" ,perl-xml-parser)
+       ("perl-xml-sax-writer" ,perl-xml-sax-writer)
+       ("perl-xml-simple" ,perl-xml-simple)
+       ("perl-xml-xpathengine" ,perl-xml-xpathengine)
+       ("perl-test-pod", perl-test-pod)
+       ("perl-tree-xpathengine" ,perl-tree-xpathengine)))
+    (home-page "http://search.cpan.org/dist/XML-Twig")
+    (synopsis "A perl module for processing huge XML documents in tree mode")
+    (description
+     "@code{xml::TokeParser} provides a procedural (\"pull mode\") interface
+to @code{XML::Parser} in much the same way that Gisle Aas'
+@code{HTML::TokeParser} provides a procedural interface to @code{HTML::Parser}.
+@code{XML::TokeParser} splits its XML input up into \"tokens\", each
+corresponding to an @code{XML::Parser} event.")
+    (license license:perl-license)))
+
 (define-public perl-libxml
   (package
     (name "perl-libxml")
@@ -327,6 +367,52 @@ corresponding to an @code{XML::Parser} event.")
 module.")
     (home-page "http://search.cpan.org/~kmacleod/libxml-perl/lib/XML/Parser/PerlSAX.pm")))
 
+(define-public perl-xml-filter-buffertext
+  (package
+    (name "perl-xml-filter-buffertext")
+    (version "1.01")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/R/RB/RBERJON/"
+                           "XML-Filter-BufferText-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0p5785c1dsk6kdp505vapb5h54k8krrz8699hpgm9igf7dni5llg"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-xml-sax-base" ,perl-xml-sax-base)))
+    (home-page "http://search.cpan.org/dist/XML-Filter-BufferText")
+    (synopsis "Filter to put all characters() in one event")
+    (description "This is a very simple filter.  One common cause of grief (and
+programmer error) is that XML parsers aren't required to provide character
+events in one chunk.  They can, but are not forced to, and most don't.  This
+filter does the trivial but oft-repeated task of putting all characters into a
+single event.")
+    (license license:perl-license)))
+
+(define-public perl-xml-handler-yawriter
+  (package
+    (name "perl-xml-handler-yawriter")
+    (version "0.23")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://cpan/authors/id/K/KR/KRAEHE/"
+                           "XML-Handler-YAWriter-" version ".tar.gz"))
+       (sha256
+        (base32
+         "11d45a1sz862va9rry3p2m77pwvq3kpsvgwhc5ramh9mbszbnk77"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-libxml" ,perl-libxml)))
+    (home-page "http://search.cpan.org/dist/XML-Handler-YAWriter")
+    (synopsis "Yet another Perl SAX XML Writer")
+    (description "YAWriter implements Yet Another @code{XML::Handler::Writer}. 
+The reasons for this one are that I needed a flexible escaping technique, and
+want some kind of pretty printing.")
+    (license license:perl-license)))
+
 (define-public perl-xml-libxml
   (package
     (name "perl-xml-libxml")
@@ -510,6 +596,33 @@ base class so you don't have to, for example, implement the characters()
 callback.")
     (license license:perl-license)))
 
+(define-public perl-xml-sax-writer
+  (package
+    (name "perl-xml-sax-writer")
+    (version "0.56")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append
+                   "mirror://cpan/authors/id/P/PE/PERIGRIN/"
+                   "XML-SAX-Writer-" version ".tar.gz"))
+             (sha256
+              (base32
+               "00vx47493rdgwmirxfgspwanlc9if389jsxq2w1ibj3ja2igfwyh"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-libxml" ,perl-libxml)
+       ("perl-xml-filter-buffertext" ,perl-xml-filter-buffertext)
+       ("perl-xml-namespacesupport", perl-xml-namespacesupport)
+       ("perl-xml-sax-base" ,perl-xml-sax-base)))
+    (license license:perl-license)
+    (home-page "http://search.cpan.org/dist/XML-SAX-Writer")
+    (synopsis "SAX2 XML Writer")
+    (description
+     "A new XML Writer was needed to match the SAX2 effort because quite
+naturally no existing writer understood SAX2.  My first intention had been to
+start patching @code{XML::Handler::YAWriter} as it had previously been my
+favourite writer in the SAX1 world.")))
+
 (define-public perl-xml-simple
   (package
     (name "perl-xml-simple")
@@ -774,6 +887,53 @@ https://www.w3.org/TR/xpath} and yet allow extensions to be added in
 the form of functions.")
     (license license:perl-license)))
 
+(define-public perl-xml-xpathengine
+  (package
+    (name "perl-xml-xpathengine")
+    (version "0.14")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://cpan/authors/id/M/MI/MIROD/"
+                                  "XML-XPathEngine-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0r72na14bmsxfd16s9nlza155amqww0k8wsa9x2a3sqbpp5ppznj"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/XML-XPathEngine")
+    (synopsis "A re-usable XPath engine for DOM-like trees")
+    (description
+     "This module provides an XPath engine, that can be re-used by other
+module/classes that implement trees.
+
+In order to use the XPath engine, nodes in the user module need to mimick DOM
+nodes.  The degree of similitude between the user tree and a DOM dictates how
+much of the XPath features can be used.  A module implementing all of the DOM
+should be able to use this module very easily (you might need to add the cmp
+method on nodes in order to get ordered result sets).")
+    (license license:perl-license)))
+
+(define-public perl-tree-xpathengine
+  (package
+    (name "perl-tree-xpathengine")
+    (version "0.05")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://cpan/authors/id/M/MI/MIROD/"
+                                  "Tree-XPathEngine-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1vbbw8wxm79r3xbra8narw1dqvm34510q67wbmg2zmj6zd1k06r9"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/Tree-XPathEngine")
+    (synopsis "A re-usable XPath engine")
+    (description
+     "This module provides an XPath engine, that can be re-used by other
+module/classes that implement trees.
+
+It is designed to be compatible with @code{Class::XPath}, ie it passes its
+tests if you replace @code{Class::XPath} by @code{Tree::XPathEngine}.")
+    (license license:perl-license)))
+
 (define-public pugixml
   (package
     (name "pugixml")
-- 
2.12.2