nextgen

 view release on metacpan or  search on metacpan

lib/nextgen.pm  view on Meta::CPAN


## CPAN procedural
use autodie    ();
use indirect   ();

## CPAN OO
use Moose ();
use B::Hooks::EndOfScope qw(on_scope_end);
use namespace::autoclean ();

use nextgen::blacklist;

sub import {
	my ( $class, %args ) = @_;

	my @caller = caller;
	my $pkg = $caller[0];

	## This will make nextgen a noop for main with -Mnextgen -e''
	## Instead nextgen will only affect package class (per oose.pm)
	## This is no longer desired because it permits -Mnextgen -MNEXT -e'1'
	## So, it can stayl commented out
	## if (
	## 	$caller[2] == 0 # line
	## 	&& $caller[1] eq '-e' && $0 eq '-e'
	## ) {
	## 	return ()
	## }

	my $procedural = (
		$pkg eq 'main'
		|| defined $args{'mode'} && $args{'mode'} ~~ qr/:procedural/
	) ? 1 : 0
	;

	feature->import(':5.10');
	indirect->unimport(':fatal');
	autodie->import();

	## Moose will import warnings and strict by default
	if ( !$procedural && $pkg ne 'main' ) {
		mro::set_mro( $pkg, 'c3' );
		
		Moose->import({ 'into' => $pkg })
			unless $pkg->can('meta')
		;
		
		## Cleanup if the package has a new or meta (Moose::Roles)
		on_scope_end( sub {
			no strict qw/refs/;
			no warnings;
			namespace::autoclean->import( -cleanee => $pkg )
				if defined $pkg->can('new')
				|| defined $pkg->can('meta')
			;
		} )
	
	}
	else {	
		warnings->import();
		strict->import();
	}
		

	nextgen::blacklist->import(
		_blacklist_policy()
		, { -callee => $pkg }
	);
	
}

sub _blacklist_policy {

	state $nextgen_default_blacklist = {
		'base.pm' => {
			replacement => 'parent'
			, reason => "This module has been deprecated by 'parent', which really shouldn't be used either. Check out 'extends', in Moose.pm."
		}
		, 'Mouse.pm' => {
			replacement => 'Moose'
			, reason => "nextgen imports Moose which generates faster code than Mouse"
		}
		, 'Class/Accessor.pm' => {
			replacement => 'Moose'
			, reason => "Moose provides Accessor builder functionality through the 'has' builder"
		}
		, 'Class/Accessor/Fast.pm' => {
			replacement => 'Moose'
			, reason => "Moose provides Accessor builder functionality through the 'has' builder"
		}
		, 'Class/Accessor/Faster.pm' => {
			replacement => 'Moose'
			, reason => "NEXT is deprecated"
		}
		, 'NEXT.pm' => {
			replacement => 'mro'
			, reason => "NEXT is deprecated"
		}

		## Reason needed here
		, 'Switch.pm' => {
			replacement => 'features'
			, reason => "5.10 provides a native switch statement see 'perldoc perlsyn' for more info"
		}
		, 'Digest/SHA1.pm' => {
			replacement => 'Digest::SHA'
			, reason => "Digest::SHA1 is deprecated"
		}
		, 'Class/C3.pm' => {
			replacement => 'mro'
			, reason => "nextgen imports 'mro'"
		}
		, 'MRO/Compat.pm' => {
			replacement => 'mro'
			, reason => "nextgen imports 'mro'"
		}

		## Plain not needed, ever
		, 'strict.pm' => {
			replacement => 'nextgen'
			, reason => "nextgen imports 'strict'"



( run in 2.233 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )