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


version 0.2.1


For consuming plugins:

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

    sub bootstrap {
        my $bootstrap_root = $_[0]->_bootstrap_root;
        # Do the actual bootstrap work here

For users of plugins:

    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



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.



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.


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


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


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 behaviour was to assume 0 Candidates and 2 or more Candidates were the same problem.




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.



"Latest" mtime candidate selector

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


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


"Latest" version candidate selector

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


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

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


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




Proxy for List::UtilsBy::max_by


Proxy for List::UtilsBy::nmax_by


Kent Fredric <>


This software is copyright (c) 2013 by Kent Fredric <>.

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