Initial Commit
This commit is contained in:
137
database/perl/vendor/lib/Specio/Role/Inlinable.pm
vendored
Normal file
137
database/perl/vendor/lib/Specio/Role/Inlinable.pm
vendored
Normal file
@@ -0,0 +1,137 @@
|
||||
package Specio::Role::Inlinable;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION = '0.46';
|
||||
|
||||
use Eval::Closure qw( eval_closure );
|
||||
|
||||
use Role::Tiny;
|
||||
|
||||
requires '_build_description';
|
||||
|
||||
{
|
||||
my $attrs = {
|
||||
_inline_generator => {
|
||||
is => 'ro',
|
||||
isa => 'CodeRef',
|
||||
predicate => '_has_inline_generator',
|
||||
init_arg => 'inline_generator',
|
||||
},
|
||||
inline_environment => {
|
||||
is => 'ro',
|
||||
isa => 'HashRef',
|
||||
lazy => 1,
|
||||
init_arg => 'inline_environment',
|
||||
builder => '_build_inline_environment',
|
||||
},
|
||||
_generated_inline_sub => {
|
||||
is => 'ro',
|
||||
isa => 'CodeRef',
|
||||
init_arg => undef,
|
||||
lazy => 1,
|
||||
builder => '_build_generated_inline_sub',
|
||||
},
|
||||
declared_at => {
|
||||
is => 'ro',
|
||||
isa => 'Specio::DeclaredAt',
|
||||
required => 1,
|
||||
},
|
||||
description => {
|
||||
is => 'ro',
|
||||
isa => 'Str',
|
||||
init_arg => undef,
|
||||
lazy => 1,
|
||||
builder => '_build_description',
|
||||
},
|
||||
};
|
||||
|
||||
## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
|
||||
sub _attrs {
|
||||
return $attrs;
|
||||
}
|
||||
}
|
||||
|
||||
# These are here for backwards compatibility. Some other packages that I wrote
|
||||
# may call the private methods.
|
||||
|
||||
## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
|
||||
sub _description { $_[0]->description }
|
||||
sub _inline_environment { $_[0]->inline_environment }
|
||||
## use critic
|
||||
|
||||
sub can_be_inlined {
|
||||
my $self = shift;
|
||||
|
||||
return $self->_has_inline_generator;
|
||||
}
|
||||
|
||||
sub _build_generated_inline_sub {
|
||||
my $self = shift;
|
||||
|
||||
my $source
|
||||
= 'sub { ' . $self->_inline_generator->( $self, '$_[0]' ) . '}';
|
||||
|
||||
return eval_closure(
|
||||
source => $source,
|
||||
environment => $self->inline_environment,
|
||||
description => 'inlined sub for ' . $self->description,
|
||||
);
|
||||
}
|
||||
|
||||
sub _build_inline_environment {
|
||||
return {};
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
# ABSTRACT: A role for things which can be inlined (type constraints and coercions)
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Specio::Role::Inlinable - A role for things which can be inlined (type constraints and coercions)
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 0.46
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This role implements a common API for inlinable things, type constraints and
|
||||
coercions. It is fully documented in the relevant classes.
|
||||
|
||||
=for Pod::Coverage .*
|
||||
|
||||
=head1 SUPPORT
|
||||
|
||||
Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
|
||||
|
||||
I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
|
||||
|
||||
=head1 SOURCE
|
||||
|
||||
The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Dave Rolsky <autarch@urth.org>
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is Copyright (c) 2012 - 2020 by Dave Rolsky.
|
||||
|
||||
This is free software, licensed under:
|
||||
|
||||
The Artistic License 2.0 (GPL Compatible)
|
||||
|
||||
The full text of the license can be found in the
|
||||
F<LICENSE> file included with this distribution.
|
||||
|
||||
=cut
|
||||
Reference in New Issue
Block a user