Kent Fredric │‫3﹪🔋

NAME

Dist::Zilla::Role::Bootstrap - Shared logic for bootstrap things.

VERSION

version 1.001000

SYNOPSIS

For consuming plugins:

    use Moose;
    with 'Dist::Zilla::Role::Bootstrap';

    sub bootstrap {
        my $bootstrap_root = $_[0]->_bootstrap_root;
        # Do the actual bootstrap work here
        $_[0]->_add_inc('./some/path/here');
    }

For users of plugins:

    [Some::Plugin::Name]
    try_built = 0 ; # use / as the root to bootstrap
    try_built = 1 ; # try to use /Dist-Name-.*/ instead of /

    fallback  = 0 ; # don't bootstrap at all if /Dist-Name-.*/ matches != 1 things
    fallback  = 1 ; # fallback to / if /Dist-Name-.*/ matches != 1 things

DESCRIPTION

This module is a role that aims to be consumed by plugins that want to perform some very early bootstrap operation that may affect the loading environment of successive plugins, especially with regards to plugins that may wish to build with themselves, either by consuming the source tree itself, or by consuming a previous built iteration.

Implementation is quite simple:

1. with this role in your plugin
  with 'Dist::Zilla::Role::Bootstrap'
2. Implement the bootstrap sub.
  sub bootstrap {
    my ( $self ) = @_;
  }
3. Optional: Fetch the discovered bootstap root via:
  $self->_bootstap_root
4. Optional: Load some path into @INC via:
  $self->_add_inc($path)

REQUIRED METHODS

bootstrap

Any user specified bootstrap method will be invoked during plugin_from_config.

This is AFTER ->new, AFTER ->BUILD, and AFTER dzil's internal plugin_from_config steps.

This occurs within the register_component phase of the plug-in loading and configuration.

This also occurs BEFORE Dist::Zilla attaches the plug-in into the plug-in stash.

ATTRIBUTES

distname

The name of the distribution.

This value is vivified by asking zilla->name.

Usually this value is populated by dist.ini in the property name

However, occasionally, this value is discovered by a plugin.

In such a case, that plugin cannot be bootstrapped, because that plugin MUST be loaded prior to bootstrap.

try_built

This attribute controls how the consuming plugin behaves.

  • false (default) : bootstrapping is only done to PROJECTROOT/lib

  • true : bootstrap attempts to try PROJECTROOT/<distname>-<version>/lib

fallback

This attribute is for use in conjunction with try_built

  • false : When PROJECTROOT/<distname>-<version> does not exist, don't perform any bootstrapping

  • true (default) : When PROJECTROOT/<distname>-<version> does not exist, bootstrap to PROJECTROOT/lib

try_built_method

This attribute controls how try_built behaves when multiple directories exist that match PROJECTROOT/<distname>-.*

Two valid options at this time:

  • mtime (default) : Pick the directory with the most recent mtime

  • parseversion : Attempt to parse versions on all candidate directories and use the one with the largest version.

Prior to 0.2.0 this property did not exist, and default behavior was to assume 0 Candidates and 2 or more Candidates were the same problem.

PRIVATE ATTRIBUTES

_cwd

_bootstrap_root

Internal: This is the real legwork, and resolves the base directory using the bootstrap resolution protocol.

It should always return a project root of some kind, whether it be a source tree, or built source tree.

It can also return undef if discovery concludes that no bootstrap can or should be performed.

PRIVATE METHODS

_pick_latest_mtime

"Latest" mtime candidate selector

    my $directory = $self->_pick_latest_mtime(@directory_objects)

_get_candidate_version

Attempt to resolve a version from a directory name

    my $version = $self->_get_candidate_version($directory_object)

NOTE: At this time, the presence of -TRIAL is simply stripped and ignored

_pick_latest_parseversion

"Latest" version candidate selector

    my $directory = $self->_pick_latest_parseversion(@directory_objects)

_pick_candidate

Pick a directory from a list of candidates using the method described by try_built_method

    my $directory = $self->_pick_candidate( @directory_objects );

_add_inc

Internal: Used to perform the final step of injecting library paths into @INC

    $self->_add_inc("$libraryPath");

AUTHOR

Kent Fredric <kentnl@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Kent Fredric <kentfredric@gmail.com>.

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