Bot::ChatBots::MojoPlugin - Mojolicious Plugin base for Bot::ChatBots


   package Bot::ChatBots::Whatever;
   use Mojo::Base 'Bot::ChatBots::MojoPlugin';

   # in your Mojoliocious app
   use Mojolicious::Lite;
   plugin 'Bot::ChatBots::Whatever' => instances => [ ... ];


This module allows you to create Bot::ChatBots adapter plugins for Mojolicious. In particular, it provides a "register" method that is called by Mojolicious when you load this module as a plugin, taking care to initialize what has to be initialized and set a helper in the Mojolicious app.

The basic model is that with a single plugin you can manage a multitude of different chatbot "instances". This might not be really needed in the general case, as your program will probably serve one single chatbot at a time, but it's handy to have around.

This module is supposed to be used as a base class for your Mojolicious plugin, like this:

   package Bot::ChatBots::Whatever;
   use Mojo::Base 'Bot::ChatBots::MojoPlugin';

This will provide you with:

  • automatic registration of the plugin via "register". This takes care to parse the input parameters and create instances accordingly;

  • automatically set the name of the helper in Mojolicious' app based on the package name (see "helper_name");

  • provide means to add new instances ("add_instance") and retrieve them ("instances").



   $obj->add_instance($module, %args); # OR 
   $obj->add_instance($module, \%args);

Add a new instance (creating it).

The first argument $module is used (via "load_module" in Bot::ChatBots::Utils) to load a class and call its new method with the provided %args. The prefix that is used for this loading is the same as ref $obj, so if your package name is Bot::ChatBots::Whatever, this is what will be used.

While creating the instance, the %args hash is extended with an additional pair with key app and value to whatever "app" provides back. This allows the instance to be able and refer back to the application object should this be needed (beware that this can create loops of references). This overrides any previously present value for app, sorry.


   my $app = $obj->app;

Accessor for the application object. It is initialized by "register".


   my $name = $obj->helper_name;

Get the default name for the helper set by "register". This name is built by taking the last part of the package name (e.g. Whatever in package name Bot::ChatBots::Whatever), lowercasing it and pre-pending chatbots. (in the example, the result would be chatbots.whatever). You can override this in your derived class.

This method can also be called as a class method, e.g.:

   my $name = Bot::ChatBots::Whatever->helper_name;


   $obj->register($app, $conf);

Mojolicious::Plugin method for registering the plugin.

The registration process adds a helper function based on $conf->{helper_name} (if present) or "helper_name". For example, if the helper name is chatbots.whatever, the helper can be accessed by the application like this:

   my $obj = app->chatbots->whatever;

This will allow you to call the other methods explained in this documentation.

Argument $conf is a hash reference supporting the following keys:


to set the helper name, should you not like what "helper_name" gives back by default;


an array reference containing definitions of instances, each represented as another array reference that is expanded to the arguments list for "add_instance".


   my $aref = $obj->instances;

Accessor for defined instances, stored in an array reference.


Report bugs either through RT or GitHub (patches welcome).




Flavio Poletti <>


Copyright (C) 2016 by Flavio Poletti <>

This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0.

This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.