NAME
    App::ModuleFeaturesUtils - CLI Utilities related to Module::Features

VERSION
    This document describes version 0.006 of App::ModuleFeaturesUtils (from
    Perl distribution App-ModuleFeaturesUtils), released on 2021-08-31.

DESCRIPTION
    This distribution includes the following utilities:

    *   check-feature-set-spec

    *   check-features-decl

    *   check-module-features

    *   compare-module-features

    *   get-feature-set-spec

    *   get-features-decl

    *   list-feature-set-features

    *   list-feature-sets

FUNCTIONS
  check_feature_set_spec
    Usage:

     check_feature_set_spec(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Check specification in %FEATURES_DEF in Modules::Features::* module.

    Examples:

    *   Check %FEATURES_DEF in Module::Features::TextTable:

         check_feature_set_spec(feature_set_name => "TextTable"); # -> [200, "OK", undef, { "func.warnings" => [] }]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   feature_set_data => *hash*

    *   feature_set_name => *perl::modulefeatures::modname*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  check_features_decl
    Usage:

     check_features_decl(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Check %FEATURES in a module (or given in argument).

    Examples:

    *   Check feature declaration (%FEATURES) in a module:

         check_features_decl(module => "Text::Table::Sprintf"); # -> [200, undef, undef, {}]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   features_decl_data => *hash*

    *   module => *perl::modname*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  check_module_features
    Usage:

     check_module_features(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Check %FEATURES in a module and return the value of specified feature.

    Examples:

    *   Check all features declared in a module:

         check_module_features(module => "Text::Table::Sprintf");

        Result:

         [
           200,
           "OK",
           {
             TextTable => {
               can_align_cell_containing_color_code     => 0,
               can_align_cell_containing_newline        => 0,
               can_align_cell_containing_wide_character => 0,
               can_color                                => 0,
               can_color_theme                          => 0,
               can_colspan                              => 0,
               can_customize_border                     => 0,
               can_halign                               => 0,
               can_halign_individual_cell               => 0,
               can_halign_individual_column             => 0,
               can_halign_individual_row                => 0,
               can_hpad                                 => 0,
               can_hpad_individual_cell                 => 0,
               can_hpad_individual_column               => 0,
               can_hpad_individual_row                  => 0,
               can_rowspan                              => 0,
               can_set_cell_height                      => 0,
               can_set_cell_height_of_individual_row    => 0,
               can_set_cell_width                       => 0,
               can_set_cell_width_of_individual_column  => 0,
               can_use_box_character                    => 0,
               can_valign                               => 0,
               can_valign_individual_cell               => 0,
               can_valign_individual_column             => 0,
               can_valign_individual_row                => 0,
               can_vpad                                 => 0,
               can_vpad_individual_cell                 => 0,
               can_vpad_individual_column               => 0,
               can_vpad_individual_row                  => 0,
               speed                                    => "fast",
             },
           },
           {},
         ]

    *   Check a single feature declared in a module:

         check_module_features(module => "Text::Table::Sprintf", feature_name => "speed");

        Result:

         [200, "OK", "fast", {}]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   feature_name => *str*

        Can be unqualified:

         feature_name

        or qualified with feature set name using the "::" or "/" separator:

         Feature::SetName::feature_name
         Feature/SetName/feature_name

    *   module* => *perl::modname*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  compare_module_features
    Usage:

     compare_module_features(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Return a table data comparing features from several modules.

    Examples:

    *   Compare features of two modules:

         compare_module_features(modules => ["Text::ANSITable", "Text::Table::More"]);

        Result:

         [
           200,
           "OK",
           [
             {
               "feature_set"       => "PerlTrove",
               "feature"           => "Development Status",
               "Text::ANSITable"   => "5 - Production/Stable",
               "Text::Table::More" => "4 - Beta",
             },
             {
               "feature_set"       => "PerlTrove",
               "feature"           => "Environment",
               "Text::ANSITable"   => "Console",
               "Text::Table::More" => "Console",
             },
             {
               "feature_set"       => "PerlTrove",
               "feature"           => "Intended Audience",
               "Text::ANSITable"   => ["Developers"],
               "Text::Table::More" => ["Developers"],
             },
             {
               "feature_set"       => "PerlTrove",
               "feature"           => "License",
               "Text::ANSITable"   => "OSI Approved :: Artistic License",
               "Text::Table::More" => "OSI Approved :: Artistic License",
             },
             {
               "feature_set"       => "PerlTrove",
               "feature"           => "Programming Language",
               "Text::ANSITable"   => "Perl",
               "Text::Table::More" => "Perl",
             },
             {
               "feature_set"       => "PerlTrove",
               "feature"           => "Topic",
               "Text::ANSITable"   => [
                                        "Software Development :: Libraries :: Perl Modules",
                                        "Utilities",
                                      ],
               "Text::Table::More" => [
                                        "Software Development :: Libraries :: Perl Modules",
                                        "Utilities",
                                      ],
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_align_cell_containing_color_code",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_align_cell_containing_newline",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_align_cell_containing_wide_character",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_color",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_color_theme",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_colspan",
               "Text::ANSITable"   => 0,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_customize_border",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_halign",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_halign_individual_cell",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_halign_individual_column",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_halign_individual_row",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_hpad",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_hpad_individual_cell",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_hpad_individual_column",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_hpad_individual_row",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_rowspan",
               "Text::ANSITable"   => 0,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_set_cell_height",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_set_cell_height_of_individual_row",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_set_cell_width",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_set_cell_width_of_individual_column",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_use_box_character",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_valign",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_valign_individual_cell",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_valign_individual_column",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_valign_individual_row",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 1,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_vpad",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_vpad_individual_cell",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_vpad_individual_column",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "can_vpad_individual_row",
               "Text::ANSITable"   => 1,
               "Text::Table::More" => 0,
             },
             {
               "feature_set"       => "TextTable",
               "feature"           => "speed",
               "Text::ANSITable"   => "slow",
               "Text::Table::More" => "slow",
             },
           ],
           {
             "table.fields" => [
               "feature_set",
               "feature",
               "Text::ANSITable",
               "Text::Table::More",
             ],
           },
         ]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   modules* => *array[perl::modname]*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  get_feature_set_spec
    Usage:

     get_feature_set_spec(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Get feature set specification.

    Examples:

    *   Example #1:

         get_feature_set_spec(feature_set_name => "TextTable"); # -> [200, "OK", {}, {}]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   feature_set_name* => *perl::modulefeatures::modname*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  get_features_decl
    Usage:

     get_features_decl(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Get features declaration.

    Examples:

    *   Example #1:

         get_features_decl(module => "Text::Table::Tiny");

        Result:

         [
           200,
           "OK",
           {
             "features" => {
                             TextTable => {
                               can_align_cell_containing_color_code     => 1,
                               can_align_cell_containing_newline        => 0,
                               can_align_cell_containing_wide_character => 0,
                               can_color                                => 0,
                               can_color_theme                          => 0,
                               can_colspan                              => 0,
                               can_customize_border                     => 1,
                               can_halign                               => 1,
                               can_halign_individual_cell               => 0,
                               can_halign_individual_column             => 1,
                               can_halign_individual_row                => 0,
                               can_hpad                                 => 0,
                               can_hpad_individual_cell                 => 0,
                               can_hpad_individual_column               => 0,
                               can_hpad_individual_row                  => 0,
                               can_rowspan                              => 0,
                               can_set_cell_height                      => 0,
                               can_set_cell_height_of_individual_row    => 0,
                               can_set_cell_width                       => 0,
                               can_set_cell_width_of_individual_column  => 0,
                               can_use_box_character                    => 0,
                               can_valign                               => 0,
                               can_valign_individual_cell               => 0,
                               can_valign_individual_column             => 0,
                               can_valign_individual_row                => 0,
                               can_vpad                                 => 0,
                               can_vpad_individual_cell                 => 0,
                               can_vpad_individual_column               => 0,
                               can_vpad_individual_row                  => 0,
                               speed                                    => "medium",
                             },
                           },
             "module_v" => 1.02,
             "x.source" => "pm:Text::Table::Tiny::_ModuleFeatures",
           },
           {},
         ]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   module* => *perl::modname*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  list_feature_set_features
    Usage:

     list_feature_set_features(%args) -> [$status_code, $reason, $payload, \%result_meta]

    List features in a feature set.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   detail => *bool*

        Return detailed record for each result item.

    *   feature_set_name* => *perl::modulefeatures::modname*

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

  list_feature_sets
    Usage:

     list_feature_sets(%args) -> [$status_code, $reason, $payload, \%result_meta]

    List feature sets (in modules under Module::Features:: namespace).

    Examples:

    *   Example #1:

         list_feature_sets();

        Result:

         [
           200,
           "OK",
           ["Dummy", "PerlTrove", "PythonTrove", "TextTable"],
           {},
         ]

    *   Show detail:

         list_feature_sets();

        Result:

         [
           200,
           "OK",
           ["Dummy", "PerlTrove", "PythonTrove", "TextTable"],
           {},
         ]

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   detail => *bool*

        Return detailed record for each result item.

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/App-ModuleFeaturesUtils>.

SOURCE
    Source repository is at
    <https://github.com/perlancar/perl-App-ModuleFeaturesUtils>.

SEE ALSO
    Module::Features

AUTHOR
    perlancar <perlancar@cpan.org>

CONTRIBUTING
    To contribute, you can send patches by email/via RT, or send pull
    requests on GitHub.

    Most of the time, you don't need to build the distribution yourself. You
    can simply modify the code, then test via:

     % prove -l

    If you want to build the distribution (e.g. to try to install it locally
    on your system), you can install Dist::Zilla,
    Dist::Zilla::PluginBundle::Author::PERLANCAR, and sometimes one or two
    other Dist::Zilla plugin and/or Pod::Weaver::Plugin. Any additional
    steps required beyond that are considered a bug and can be reported to
    me.

COPYRIGHT AND LICENSE
    This software is copyright (c) 2021 by perlancar <perlancar@cpan.org>.

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

BUGS
    Please report any bugs or feature requests on the bugtracker website
    <https://rt.cpan.org/Public/Dist/Display.html?Name=App-ModuleFeaturesUti
    ls>

    When submitting a bug or request, please include a test-file or a patch
    to an existing test-file that illustrates the bug or desired feature.