NAME

Perinci::Sub::Gen::FromClass - Generate function (and its Rinci metadata) from a class

VERSION

This document describes version 0.04 of Perinci::Sub::Gen::FromClass (from Perl distribution Perinci-Sub-Gen-FromClass), released on 2015-09-04.

SYNOPSIS

Given a Mo/Moo/Mouse/Moose class:

    # MyClass
    use Moo;
    has attr1 => (is => 'ro', required=>1);
    has attr2 => (is => 'rw');
    sub do_this { ... }
    sub do_that { ... }
    1;

you can generate a function for it:

    use Perinci::Sub::Gen::FromClass qw(gen_func_from_class);
    gen_func_from_class(
        name   => 'do_this',

        class  => 'MyClass',
        type   => 'Moo',
        method => 'do_this',
        method_args => [3, 4, 5], # optional
    );

then if you call this function:

    do_this(attr1=>1, attr2=>2);

it will do something like (instantiate class and call a method):

    MyClass->new(attr1=>1, attr2=>2)->do_this(3, 4, 5);

DESCRIPTION

Sometimes some module annoyingly only provides OO interface like:

 my $obj = Foo->new(arg1=>1, arg2=>2);
 $obj->some_action;

when it could very well just be:

 some_action(arg1=>1, arg2=>2);

This module helps you create that function from a class.

FUNCTIONS

gen_func_from_class(%args) -> [status, msg, result, meta]

Generate function (and its Rinci metadata) from a class.

gen_func_from_class will create a function and Rinci metadata from a {Mo,Moo,Moose,Mouse} class. Given a class like this:

 # MyClass
 use Moo;
 has attr1 => (is => 'ro', required=>1);
 has attr2 => (is => 'rw');
 sub meth1 { ... }
 sub meth2 { ... }
 1;

will create a function that does something like this (it will basically instantiate a class, set its attributes, and call a method):

 MyClass->new(attr1=>..., attr2=>...)->meth1;

along with Rinci metadata like this:

 {
     v => 1.1,
     args => {
         attr1 => { req=>1, schema=>'any' },
         attr2 => { schema=>'any' },
     },
 }

Currently only Mo- and Moo-based class is supported. Support for other Mo* family members will be added.

Arguments ('*' denotes required arguments):

  • class* => any

    Class name, will be loaded with require().

  • description => str

    Generated function's description.

  • install => bool (default: 1)

    Whether to install generated function (and metadata).

    By default, generated function will be installed to the specified (or caller's) package, as well as its generated metadata into %SPEC. Set this argument to false to skip installing.

  • method* => any

    Method of class to call.

  • method_args => array

  • name => str

    Generated function's name, e.g. `myfunc`.

  • package => str

    Generated function's package, e.g. `My::Package`.

    This is needed mostly for installing the function. You usually don't need to supply this if you set install to false.

    If not specified, caller's package will be used by default.

  • summary => str

    Generated function's summary.

Returns an enveloped result (an array).

First element (status) is an integer containing HTTP status code (200 means OK, 4xx caller error, 5xx function error). Second element (msg) is a string containing error message, or 'OK' if status is 200. Third element (result) is optional, the actual result. Fourth element (meta) is called result metadata and is optional, a hash that contains extra information.

Return value: A hash containing generated function, metadata (hash)

SEE ALSO

Rinci

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/Perinci-Sub-Gen-FromClass.

SOURCE

Source repository is at https://github.com/perlancar/perl-Perinci-Sub-Gen-FromClass.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Gen-FromClass

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.

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by 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.