diff --git a/README.rst b/README.rst
index 1e12772..0ba3fb4 100644
--- a/README.rst
+++ b/README.rst
@@ -173,6 +173,13 @@ Check `Hackage `_ for updates.
hackage
The name used on Hackage, e.g. ``pandoc``.
+Check CPAN
+--------------
+Check `MetaCPAN `_ for updates.
+
+cpan
+ The name used on CPAN, e.g. ``YAML``.
+
Check Local Pacman Database
---------------------------
This is used when you run ``nvchecker`` on an Arch Linux system and the program always keeps up with a package in your configured repositories for `Pacman`_.
diff --git a/nvchecker/get_version.py b/nvchecker/get_version.py
index 6b5741b..ed58ef2 100644
--- a/nvchecker/get_version.py
+++ b/nvchecker/get_version.py
@@ -5,7 +5,7 @@ logger = logging.getLogger(__name__)
handler_precedence = (
'github', 'gitcafe', 'aur', 'pypi', 'archpkg', 'gems', 'pacman',
'cmd', 'bitbucket', 'gcode_hg', 'gcode_svn', 'regex', 'manual', 'vcs',
- 'npm', 'hackage',
+ 'npm', 'hackage', 'cpan',
)
def get_version(name, conf, callback):
diff --git a/nvchecker/source/cpan.py b/nvchecker/source/cpan.py
new file mode 100644
index 0000000..dd999f2
--- /dev/null
+++ b/nvchecker/source/cpan.py
@@ -0,0 +1,18 @@
+import json
+from functools import partial
+
+from tornado.httpclient import AsyncHTTPClient
+
+# Using metacpan
+CPAN_URL = 'https://api.metacpan.org/release/%s'
+
+def get_version(name, conf, callback):
+ repo = conf.get('cpan') or name
+ url = CPAN_URL % repo
+ AsyncHTTPClient().fetch(url, user_agent='lilydjwg/nvchecker',
+ callback=partial(_cpan_done, name, callback))
+
+def _cpan_done(name, callback, res):
+ data = json.loads(res.body.decode('utf-8'))
+ version = data['version']
+ callback(name, version)