NAME
   Plugin::Tiny - A tiny plugin system for perl

VERSION
   version 0.002

SYNOPSIS
     #from core or bundling plugin
     use Moose; #optional, t/tiny.t avoids using moose in core
     use Plugin::Tiny;
     has 'plugins'=>(
       is=>'ro',
       isa=>'Plugin::Tiny',
       default=>sub{Plugin::Tiny->new()}
     );

     #load plugin_class (and perhaps phase) from your configuration
     $self->plugins->register(
       phase=>$phase,         #optional; defaults to last part of plugin class
       plugin=>$plugin_class, #required
       role=>$role,           #optional
       arg1=>$arg1,           #optional
       arg2=>$arg2,           #optional
     );

     #execute your plugin's methods
     my $plugin=$self->get_plugin ($phase);
     $plugin->do_something(@args);

DESCRIPTION
   Plugin::Tiny is minimalistic plugin system for perl. Each plugin is
   associated with a keyword (referred to as phase). A limitation of
   Plugin::Tiny is that each phase can have only one plugin.

 Bundles of Plugins
   You can still create bundles of plugins if you hand the plugin system
   down to the (bundeling) plugin. That way, you can load multiple plugins
   for one phase (althoughyou still need distinct phase labels for each
   plugin).

     #in your core
     $self->plugins->register(
       phase=>'Scan',
       plugin=>'Plugin::ScanBundle',
       plugins=>$self->plugins, #plugin system
     );

     #in Plugin::ScanBundle
     has 'plugins'=>(is=>'ro', isa=>'Plugin::Tiny', required=>1);
     $self->plugins->register (plugin=>'Plugin::Scan1');
     $self->plugins->register (plugin=>'Plugin::Scan2');

     my $scan1=$self->plugins->get('Scan1');
     $scan1->do_something(@args);

 Require a Plugin Role
   You may want to do a plugin role for all you plugins, e.g. to
   standardize an interface etc.

ATTRIBUTES
 prefix
   Optional init argument. You can have the prefix added to all plugin
   classes you register so save some typing and force plugins in your
   namespace:

     #without prefix
     my $ps=Plugin::Tiny->new
     $ps->register(plugin='Your::App::Plugin::Example1');
     $ps->register(plugin='Your::App::Plugin::Example2');

     #with prefix
     my $ps=Plugin::Tiny->new (  prefix=>'Your::App::Plugin::' );
     $ps->register(plugin='Example1');
     $ps->register(plugin='Example2');

 role
   Optional init argument. A default role to be applied to all plugins. Can
   be overwritten in register.

METHODS
 $plugin_system->register(phase=>$phase, plugin=>$plugin_class);
   Optionally, you can also specify a role which your plugin will have to
   be able to apply. Remaining key value pairs are passed down to the
   plugin constructor:

     $plugin_system->register (
       phase=>$phase,           #optional. Defaults to last part of plugin_class
       plugin=>$plugin_class,   #required
       role=>$role,             #optional
       plugins=>$plugin_system, #optional
       args=>$more_args,        #optional
     );

   A side-effect is that your plugin cannot use 'phase', 'plugin', 'role'
   as named arguments.

   Returns the newly created plugin object on success. Confesses on error.

 my $plugin=$self->get_plugin ($phase);
   Returns the plugin object associated with the phase.

AUTHOR
   Maurice Mengel <[email protected]>

COPYRIGHT AND LICENSE
   This software is copyright (c) 2012 by Maurice Mengel.

   This is free software; you can redistribute it and/or modify it under
   the same terms as the Perl 5 programming language system itself.