The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
=pod

=head1 NAME

Bot::Cobalt::Manual::Plugins::Dist - Packaging Cobalt plugins

=head1 DESCRIPTION

Packaging L<Bot::Cobalt> plugins is just like packaging any other Perl 
module. 

Typically, the easiest way to do so quickly is via L<Module::Build>. 
(For more involved distributions you may want to look at 
L<ExtUtils::MakeMaker>).

(This guide only covers packaging plugins; See 
L<Bot::Cobalt::Manual::Plugins> for more on writing plugins and 
L<Bot::Cobalt::Manual::Plugins::Tutorial> for a walk-through.)

=head2 Layout

Create a dist dir for your module:

  $ mkdir Bot-Cobalt-Plugin-MyPlugin

  $ cd Bot-Cobalt-Plugin-MyPlugin

   # create this dist's libdir:
  $ mkdir -p lib/Bot/Cobalt/Plugin/

  $ cd lib/Bot/Cobalt/Plugin/

   # create your plugin:
  $ $EDITOR MyPlugin.pm

=head2 Build.PL

L<Module::Build> requires a C<Build.PL> file.

Here's a simple one based around one centralized plugin; your plugin 
will need to declare a proper $VERSION:

  #!/usr/bin/perl
  ## Simple example Build.PL
  my $build = Module::Build->new(
    module_name   => "Bot::Cobalt::Plugin::User::MyPlugin",
    dist_abstract => "My Bot::Cobalt plugin",
    dist_author   => 'Me <myself@example.ext>',
    license => 'perl',
    create_makefile_pl => 'small',
    requires => {
      'Bot::Cobalt' => 0.01,
    },
  );
  $build->create_build_script;


Create a dist tarball:
  $ ./Build dist


Users of your plugin can install the distribution (and dependencies) via 
C<cpan> by unpacking your plugin dist and specifying the local directory:

  $ cd Bot-Cobalt-Plugin-MyPlugin
  $ cpan .

...or via Module::Build directly:

  $ perl Build.PL

  $ ./Build

   # may need root access (or perhaps L<local::lib>):
  $ ./Build install

When your plugin is release-ready, please consider posting it to CPAN.

=head2 Configuration files

L<Bot::Cobalt> comes with the L<cobalt2-plugin-installcf> tool, allowing 
for easy installation of plugin-specific configuration files to user 
configuration directories.

In order to provide a configuration file installable via the installcf 
tool, your plugin needs a Conf.pm module providing a 'conf' class 
method.

Here's an example demonstrating using the DATA filehandle to provide an 
example configuration:

  ## In lib/Bot/Cobalt/Plugin/MyPlugin/Conf.pm
  package Bot::Cobalt::Plugin::MyPlugin::Conf;
  
  sub conf { local $/; my $cf = <DATA>; return $cf }

  __DATA__
  ---
  ## MyPlugin example configuration.
  Opts:

    Enable_Snacks:
      - pie
      - cake

    Do_Stuff: 1

=head1 AUTHOR

Jon Portnoy <avenj@cobaltirc.org>

L<http://www.cobaltirc.org>

=cut