{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# cpanminus plugin\n",
    "\n",
    "Helpful addition to main class of [Devel::IPerl::Plugin::Perlbrew](https://metacpan.org/pod/Devel::IPerl::Plugin::Perlbrew)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "use feature 'say';\n",
    "IPerl->load_plugin('CpanMinus') unless IPerl->can('cpanm');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook uses the [Perlbrew](https://metacpan.org/pod/Devel::IPerl::Plugin::Perlbrew) plugin, so familiarity with the use of that plugin is assumed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lib 'perl-5.26.0@cpanm-test' is created.\n",
      "   perl-5.26.0                               (installed on Wed Jan 31 21:11:06 2018)\n",
      "* perl-5.26.0@cpanm-test\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# setting up a temporary library for this notebook\n",
    "IPerl->perlbrew_domain('/tmp');\n",
    "IPerl->perlbrew_lib_create('cpanm-test');\n",
    "IPerl->perlbrew('cpanm-test');\n",
    "IPerl->perlbrew_list();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Installing dependencies\n",
    "\n",
    "The `cpanm_installdeps` helper is useful for installing the dependencies of modules."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "IPerl->cpanm_installdeps('Mojo::Collection::Role::UtilsBy');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Installing modules\n",
    "\n",
    "The modules themselves can be installed using the `cpanm` helper. It exposes the full functionality of `cpanm`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully installed Mojo-Collection-Role-UtilsBy-0.001\n",
      "1 distribution installed\n"
     ]
    }
   ],
   "source": [
    "IPerl->cpanm('Mojo::Collection::Role::UtilsBy');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### check installation\n",
    "\n",
    "Slightly roundabout."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "There are 192 modules installed.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Mojo::Collection::Role::UtilsBy\n",
       "MooseX::Role::Parameterized\n",
       "Role::Tiny"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "ename": "Warning",
     "evalue": "Attempting to create directory /tmp/libs/perl-5.26.0@cpanm-test\n",
     "output_type": "error",
     "traceback": [
      "Attempting to create directory /tmp/libs/perl-5.26.0@cpanm-test\n"
     ]
    }
   ],
   "source": [
    "use Mojo::File;\n",
    "use Mojo::Collection 'c';\n",
    "IPerl->perlbrew_list_modules('modules.list');\n",
    "c(split /\\n/, Mojo::File->new('modules.list')->slurp)\n",
    "  ->tap(sub { say join ' ', \"There are\", $_->size, \"modules installed.\"; })\n",
    "  ->grep(qr/Role/)->join(\"\\n\");"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "IPerl 0.009",
   "language": "perl",
   "name": "iperl"
  },
  "language_info": {
   "file_extension": ".pl",
   "mimetype": "text/x-perl",
   "name": "perl",
   "version": "5.26.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}