Sub-Meta
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Sub/Meta/Creator.pm view on Meta::CPAN
package Sub::Meta::Creator;
use strict;
use warnings;
our $VERSION = "0.15";
use List::Util ();
use Sub::Meta;
sub _croak { require Carp; goto &Carp::croak }
sub new {
my ($class, @args) = @_;
my %args = @args == 1 ? %{$args[0]} : @args;
unless (exists $args{finders}) {
_croak 'required finders';
}
unless (ref $args{finders} && ref $args{finders} eq 'ARRAY') {
_croak 'finders must be an arrayref'
}
unless (List::Util::all { ref $_ && ref $_ eq 'CODE' } @{$args{finders}}) {
_croak 'elements of finders have to be a code reference'
}
return bless \%args => $class;
}
sub sub_meta_class { return 'Sub::Meta' }
sub finders { my $self = shift; return $self->{finders} }
sub find_materials {
my ($self, $sub) = @_;
for my $finder (@{$self->finders}) {
my $materials = $finder->($sub);
return $materials if defined $materials;
}
return;
}
sub create {
my ($self, $sub) = @_;
if (my $materials = $self->find_materials($sub)) {
return $self->sub_meta_class->new($materials)
}
return;
}
1;
__END__
=encoding utf-8
=head1 NAME
Sub::Meta::Creator - creator of Sub::Meta by code reference
=head1 SYNOPSIS
use Sub::Meta::Creator;
sub finder {
my $sub = shift;
return +{ sub => $sub }
}
my $creator = Sub::Meta::Creator->new(
finders => [ \&finder ],
);
sub foo { }
my $meta = $creator->create(\&foo);
=head1 DESCRIPTION
This module provides convenient ways to create Sub::Meta.
The purpose of this module is to make it easier to associate Sub::Meta with information of code references.
For example, Function::Parameters can retrieve not only subroutine names and packages from code references,
but also argument type information, etc. Sub::Meta::Creator can be generated Sub::Meta with such information:
use Sub::Meta::Creator;
use Sub::Meta::Finder::FunctionParameters;
my $creator = Sub::Meta::Creator->new(
finders => [ \&Sub::Meta::Finder::FunctionParameters::find_materials ]
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.624 second using v1.00-cache-2.02-grep-82fe00e-cpan-f73e49a70403 )