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 )