<html><head><title>Footprintless::Plugin</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >

<style type="text/css">
 <!--/*--><![CDATA[/*><!--*/
BODY {
  background: white;
  color: black;
  font-family: arial,sans-serif;
  margin: 0;
  padding: 1ex;
}

A:link, A:visited {
  background: transparent;
  color: #006699;
}

A[href="#POD_ERRORS"] {
  background: transparent;
  color: #FF0000;
}

DIV {
  border-width: 0;
}

DT {
  margin-top: 1em;
  margin-left: 1em;
}

.pod { margin-right: 20ex; }

.pod PRE     {
  background: #eeeeee;
  border: 1px solid #888888;
  color: black;
  padding: 1em;
  white-space: pre;
}

.pod H1      {
  background: transparent;
  color: #006699;
  font-size: large;
}

.pod H1 A { text-decoration: none; }
.pod H2 A { text-decoration: none; }
.pod H3 A { text-decoration: none; }
.pod H4 A { text-decoration: none; }

.pod H2      {
  background: transparent;
  color: #006699;
  font-size: medium;
}

.pod H3      {
  background: transparent;
  color: #006699;
  font-size: medium;
  font-style: italic;
}

.pod H4      {
  background: transparent;
  color: #006699;
  font-size: medium;
  font-weight: normal;
}

.pod IMG     {
  vertical-align: top;
}

.pod .toc A  {
  text-decoration: none;
}

.pod .toc LI {
  line-height: 1.2em;
  list-style-type: none;
}

  /*]]>*/-->
</style>


</head>
<body class='pod'>
<!--
  generated by Pod::Simple::HTML v3.32,
  using Pod::Simple::PullParser v3.32,
  under Perl v5.025000 at Wed Aug 22 21:48:31 2018 GMT.

 If you want to change this HTML document, you probably shouldn't do that
   by changing it directly.  Instead, see about changing the calling options
   to Pod::Simple::HTML, and/or subclassing Pod::Simple::HTML,
   then reconverting this document from the Pod source.
   When in doubt, email the author of Pod::Simple::HTML for advice.
   See 'perldoc Pod::Simple::HTML' for more info.

-->

<!-- start doc -->
<a name='___top' class='dummyTopAnchor' ></a>

<div class='indexgroup'>
<ul   class='indexList indexList1'>
  <li class='indexItem indexItem1'><a href='#NAME'>NAME</a>
  <li class='indexItem indexItem1'><a href='#VERSION'>VERSION</a>
  <li class='indexItem indexItem1'><a href='#DESCRIPTION'>DESCRIPTION</a>
  <li class='indexItem indexItem1'><a href='#CONSTRUCTORS'>CONSTRUCTORS</a>
  <ul   class='indexList indexList2'>
    <li class='indexItem indexItem2'><a href='#new()'>new()</a>
  </ul>
  <li class='indexItem indexItem1'><a href='#METHODS'>METHODS</a>
  <ul   class='indexList indexList2'>
    <li class='indexItem indexItem2'><a href='#command_packages()'>command_packages()</a>
    <li class='indexItem indexItem2'><a href='#factory_methods()'>factory_methods()</a>
  </ul>
  <li class='indexItem indexItem1'><a href='#AUTHOR'>AUTHOR</a>
  <li class='indexItem indexItem1'><a href='#COPYRIGHT_AND_LICENSE'>COPYRIGHT AND LICENSE</a>
  <li class='indexItem indexItem1'><a href='#SEE_ALSO'>SEE ALSO</a>
</ul>
</div>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="NAME"
>NAME</a></h1>

<p>Footprintless::Plugin - The base class for footprintless plugins</p>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="VERSION"
>VERSION</a></h1>

<p>version 1.29</p>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="DESCRIPTION"
>DESCRIPTION</a></h1>

<p>This class serves as a base class for plugins.
It defines the mandatory interface that a plugin must implement.
Plugins add methods to the factory itself at runtime.
For example:</p>

<pre>    package Foo::Plugin;

    use parent qw(Footprintless::Plugin);

    sub foo {
        require Foo;
        return Foo-&#62;new();
    }

    sub factory_methods {
        my ($self) = @_;
        return {
            foo =&#62; sub {
                return $self-&#62;foo(@_);
            }
        }
    }

    package Foo;

    sub new() {
        return bless({}, shift);
    }

    sub bar {
        print(&#34;BAR&#34;);
    }</pre>

<p>Then they can be registered with a factory instance:</p>

<pre>    $factory-&#62;register_plugin(Foo::Plugin-&#62;new());</pre>

<p>Or, they can be registered via configuration in the <code>footprintless.plugins</code> entity:</p>

<pre>    # $FPL_HOME/config/footprintless.pm
    return {
        plugins =&#62; [
            &#39;Foo::Plugin&#39;,
            &#39;Bar::Plugin&#39;
        ],
        &#39;Foo::Plugin&#39; =&#62; {
            # optional config
        }
        &#39;Bar::Plugin&#39; =&#62; {
            # optional config
        }
    };</pre>

<p>Then you can use the methods directly on the footprintless instance:</p>

<pre>    my $footprintless = Footprintless-&#62;new();
    my $foo = $footprintless-&#62;foo();</pre>

<p>If a key with the same name as the plugin is present in the <code>footprintless</code> entity, then the entire hashref will be set as <code>$self-</code>{config}&#62; on the plugin instance during construction. You can then override the <code>_init()</code> method to do configuration based initialization.</p>

<p>If you want to add commands, just add a module under the package returned by <a href="#command_packages()" class="podlinkpod"
>command_packages</a> (defaults to <code>ref($self) . &#39;::Command&#39;</code>):</p>

<pre>    package Foo::Plugin::Command::foo
    use Footprintless::App -command;
    
    sub execute {
        my ($self, $opts, $args) = @_;

        my $foo = $self-&#62;app()-&#62;footprintless()-&#62;foo();

        $foo-&#62;bar();
    }</pre>

<p>Then your command will be availble from the fpl command:</p>

<pre>    $&#62; fpl foo
    BAR</pre>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="CONSTRUCTORS"
>CONSTRUCTORS</a></h1>

<h2><a class='u' href='#___top' title='click to go to top of document'
name="new()"
>new()</a></h2>

<p>Creates a new plugin.</p>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="METHODS"
>METHODS</a></h1>

<h2><a class='u' href='#___top' title='click to go to top of document'
name="command_packages()"
>command_packages()</a></h2>

<p>Returns a list of packages to scan for commands.</p>

<h2><a class='u' href='#___top' title='click to go to top of document'
name="factory_methods()"
>factory_methods()</a></h2>

<p>Returns a hash full of factory methods. The key will be used as the method name that gets registered with the factory. Its value must be a reference to a sub.</p>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="AUTHOR"
>AUTHOR</a></h1>

<p>Lucas Theisen &#60;lucastheisen@pastdev.com&#62;</p>

<h1><a class='u' href='#___top' title='click to go to top of document'
name="COPYRIGHT_AND_LICENSE"
>COPYRIGHT AND LICENSE</a></h1>

<p>This software is copyright (c) 2016 by Lucas Theisen.</p>

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

<h1><a class='u' href='#___top' title='click to go to top of document'
name="SEE_ALSO"
>SEE ALSO</a></h1>

<p>Please see those modules/websites for more information related to this module.</p>

<ul>
<li><a href="http://search.cpan.org/perldoc?Footprintless" class="podlinkpod"
>Footprintless</a></li>
</ul>

<!-- end doc -->

</body></html>