Sub-Meta

 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 distribution
 view release on metacpan -  search on metacpan

( run in 0.624 second using v1.00-cache-2.02-grep-82fe00e-cpan-f73e49a70403 )