NAME
    Perinci::Class::Base - Base class for your Rinci-metadata-containing
    classes

VERSION
    This document describes version 0.002 of Perinci::Class::Base (from Perl
    distribution Perinci-Class-Base), released on 2020-02-16.

SYNOPSIS
    In My/Animal.pm:

     package My::Animal;
     use parent 'Perinci::Class::Base';
 
     our %SPEC;
 
     $SPEC{speak} = {
         v => 1.1,
         is_meth => 1,
     };
     sub speak {
         die "Please override me!";
     }
 
     sub new {
         my ($package, %args) = @_;
         bless \%args, $package;
     }
 
     1;

    In My/Dog.pm:

     package My::Dog;
     use parent 'My::Animal';
 
     our %SPEC;
 
     # speak's metadata will "inherit" (use metadata from the base class), since we
     # don't have additionl/modified/removed arguments, etc.
 
     sub speak {
         print "woof\n";
         [200];
     }
 
     $SPEC{play_dead} = {
         v => 1.1,
         is_meth => 1,
         args => {
             seconds => {schema=>'uint*', default=>5},
         },
     };
     sub play_dead {
         my ($self, %args) = @_;
         sleep $;
         [200];
     }
 
     1;

    in My/Parrot.pm:

     package My::Parrot;
     use parent 'My::Animal';
 
     our %SPEC;
 
     # we are modifying 'speak' metadata as we add an argument.
     $SPEC{speak} = {
         v => 1.,
         is_meth => 1,
         args => {
             word => {schema=>'str*'},
         },
     };
     sub speak {
         my ($self, $word) = @_;
         print "squawk! $word!\n";
         [200];
     }
 
     1;

    To get Rinci metadata for a method:

     use My::Dog;
     my $meta = My::Dog->get_rinci_meta_for('speak');

    A more convenient syntax to define modified method metadata in My/Dog.pm
    (the second argument will be merged using Data::ModeMerge):

     package My::Parrot2;
     use parent 'My::Animal';
 
     our %SPEC;
 
     # we are modifying 'speak' metadata as we add an argument.
     __PACKAGE__->modify_rinci_meta_for(speak => {
         args => {
             word => {schema=>'str*'},
         },
     });
     sub speak {
         my ($self, $word) = @_;
         print "squawk! $word!\n";
         [200];
     }
 
     1;

    Another example of modifying method metadata:

     package My::Human;
     use parent 'My::Animal';
 
     our %SPEC;
 
     # we are modifying 'speak' metadata as we remove an argument ('word') and add
     # another ('words').
     __PACKAGE__->modify_rinci_meta_for(speak => {
         args => {
             '!word' => undef,
             words => {schema=>'str*'},
         },
     });
     sub speak {
         my ($self, $words) = @_;
         print "$words!\n";
         [200];
     }
 
     1;

DESCRIPTION
    EXPERIMENTAL, WORK IN PROGRESS.

    Perinci::Class::Base is a base class that provides some Rinci-related
    utility routines, mainly to get/modify Rinci metadata in a class
    settings.

FUNCTIONS
  get_rinci_meta_for
    Usage:

     get_rinci_meta_for($name) -> any

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   $name* => *str*

    Return value: (any)

  modify_rinci_meta_for
    Usage:

     modify_rinci_meta_for($name, $value) -> any

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   $name* => *str*

    *   $value* => *hash*

    Return value: (any)

METHODS
  get_sub_meta_for
  modify_sub_meta_for
HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/Perinci-Class-Base>.

SOURCE
    Source repository is at
    <https://github.com/perlancar/perl-Perinci-Class-Base>.

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

    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.

SEE ALSO
    Rinci

AUTHOR
    perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2020 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.