The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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.