Macro-Simple
view release on metacpan or search on metacpan
lib/Macro/Simple.pm view on Meta::CPAN
use 5.008003;
use strict;
use warnings;
package Macro::Simple;
our $AUTHORITY = 'cpan:TOBYINK';
our $VERSION = '0.003';
use Carp;
use constant DO_MACRO => (
$] ge 5.014000 and
require Parse::Keyword and
require PPI and
require Sub::Boolean
);
use constant DO_CLEAN => eval { require namespace::clean };
sub import {
my ( $class, $macros ) = ( shift, @_ );
my $caller = caller;
$class->setup_for( $caller, $macros );
}
sub setup_for {
my ( $class, $caller, $macros ) = ( shift, @_ );
my $installer = DO_MACRO ? '_setup_using_parse_keyword' : '_setup_fallback';
for my $key ( sort keys %$macros ) {
my ( $subname, $prototype ) = ( $key =~ m{\A(\w+)(.+)\z} );
my $generator = $class->handle_generator( $macros->{$key} );
$class->$installer( {
caller => $caller,
subname => $subname,
prototype => $prototype,
generator => $generator,
} );
}
}
sub handle_generator {
my ( $class, $generator ) = ( shift, @_ );
if ( 'HASH' eq ref $generator and $generator->{is} ) {
my $code = $generator->{is}->inline_check( '$x' );
$generator = sub { sprintf 'my $x = %s; %s', $_[0], $code };
}
elsif ( 'HASH' eq ref $generator and $generator->{assert} ) {
my $code = $generator->{assert}->inline_assert( '$x' );
$generator = sub { sprintf 'my $x = %s; %s', $_[0], $code };
}
elsif ( not ref $generator ) {
my $format = $generator;
$generator = sub { sprintf $format, @_ };
}
return $generator;
}
sub _setup_using_parse_keyword {
my ( $class, $opt ) = ( shift, @_ );
my ( $caller, $subname ) = @{$opt}{qw/ caller subname /};
Sub::Boolean::make_true("$caller\::$subname");
no strict qw( refs );
Parse::Keyword::install_keyword_handler(
\&{ "$caller\::$subname" },
sub { $class->_parse( $opt ) },
);
$class->_clean( $caller, $subname );
( run in 1.937 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )