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.