NAME
MooX::Object::Pluggable - Moo eXtension to inject plugins to exist objects as a role
VERSION
version 0.0.5
SYNOPSIS
In your package:
package MyPackage;
use Moo;
use namespace::clean;
with 'MooX::Object::Pluggable';
1
Define your plugin package:
package MyPackage::Plugin::Foo;
use Moo::Role;
use namespace::clean;
sub foo { 'foo' }
Then in your script:
#!perl
use MyPackage;
my $object = MyPackage->new;
$object->load_plugins('Foo');
Or new with pluggable options:
use MyPackage;
MyPackage->new(
  pluggable_options => { search_path => 'MyPackage::Plugin' }, # optional
  load_plugins => [ "Foo", qr/::Bar$/ ]
);
Or use MooX with this:
use MooX 'Object::Pluggable' => { ... };
DESCRIPTION
MooX::Object::Pluggable for moo is designed to perform like MooseX::Object::Pluggable for Moose staff. Mainly it use Moo::Role's apply_roles_to_object to load plugins at runtime, but with the ability to choose plugins with package Module::Pluggable::Object.
METHODS
load_plugins
In most situation, your need only call the fuction load_plugins on an object. The parameters support String, Regexp, or Array or ArrayRef of them.
eg.
$o->load_plugins("Foo", "Bar", qr/^Class::Plugin::(Abc|N)[0-9]/, [ qw/Other Way/ ]);
And there's another syntax sugar, when you just want to load a specific role:
$o->load_plugins("+MooX::ConfigFromFile::Role");
# Notice that the '+' sign does not support Regexp, use whole package name with it.
plugins
The method plugins returns a array of plugins, defaultly in the namespace Your::Package::Plugin::. You can manage it by implement the _build_pluggable_options in your package and given the avaliable options' HashRef.
package MyPackage;
use Moo;
with 'MooX::Object::Pluggable';
sub _build_pluggable_options {
  { search_path => __PACKAGE__.'::Funtionals' }
}
All the avaliable options will be found in tutorial of package Module::Pluggable.
loaded_plugins
This will list all loaded plugins of current object for you.
DESIGN
Considering not import any new attributes to the consumers, I'm using a private variable for help to maintain Module::Pluggable::Object objects so that it only create once for each package, and could provide private configuration for specific objects that use diffent pluggable options in new.
There's two way to configure user defined pluggable options.
new(pluggable_options => {}, load_plugins => [])
User could directly use there specific options for plugin. And create objects with some plugins after BUILD step.
_build_pluggable_options
Implement this build function in your package, and MooX::Object::Pluggable will apply the options for you.
And you still could change default options in new method.
MooX
A MooX-compatible interface like this:
package MyPackage::Hello;
use Moo::Role;
sub hello { 'hello' }
...
package MyPackage;
use MooX::Object::Pluggable -pluggable_options => { search_path => ["MyPackage"] }, -load_plugins => ['Hello'];
Or:
use MooX
  'Object::Pluggable' => { -pluggable_options => { search_path => ["MyPackage"] }, -load_plugins => ['Hello'] };
SEE ALSO
Module::Pluggable, MooseX::Object::Pluggable
AUTHOR
Huo Linhe <linhehuo@gmail.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Huo Linhe.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.