Carrot

 view release on metacpan or  search on metacpan

lib/Carrot/Modularity/Package/Patterns.pm  view on Meta::CPAN

package Carrot::Modularity::Package::Patterns
# /type class
# /capability ""
{
	use strict;
	use warnings 'FATAL' => 'all';

	BEGIN {
		require('Carrot/Modularity/Package/Patterns./manual_modularity.pl');
	} #BEGIN

	require Carrot::Modularity::Package::Tabulator;
	my $pkg_tabulator = Carrot::Modularity::Package::Tabulator->constructor;

	require Carrot::Meta::Greenhouse::Writable_Overlay;
	my $writable_overlay = Carrot::Meta::Greenhouse::Writable_Overlay->constructor;

	require Carrot::Meta::Greenhouse::Named_RE;
	my $named_re = Carrot::Meta::Greenhouse::Named_RE->constructor;

	$named_re->provide(
		my $re_perl_pkg_n_sub = 'perl_pkg_n_sub',
		my $re_perl_pkg_last_element = 'perl_pkg_last_element',
		my $re_carrot_dot_directory = 'carrot_dot_directory');

# =--------------------------------------------------------------------------= #

sub is_relative_package_name
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
# //returns
#	::Personality::Abstract::Boolean
{
	return(substr($_[SPX_PKG_NAME], 0, 2) eq PERL_PACKAGE_DELIMITER);
}

sub qualify_package_name
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
#	pkg_anchor
# //returns
{
	if ($_[THIS]->is_relative_package_name($_[SPX_PKG_NAME]))
	{
		$_[SPX_PKG_NAME] = $_[SPX_PKG_ANCHOR].$_[SPX_PKG_NAME];
	}
	return;
}

sub is_package_anchor
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
# //returns
#	::Personality::Abstract::Boolean
{
	return(substr($_[SPX_PKG_NAME], -2, 2) eq PERL_PACKAGE_DELIMITER);
}

sub is_package_level_expander
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
# //returns
#	::Personality::Abstract::Boolean
{
	return(substr($_[SPX_PKG_NAME], -3, 3) eq '::*');
}

sub is_package_hierarchy_expander
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
# //returns
#	::Personality::Abstract::Boolean
{
	return(substr($_[SPX_PKG_NAME], -4, 4) eq '::**');
}

sub package_as_file_name
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
# //returns
#	?
{
	return(($_[SPX_PKG_NAME] =~ s{::}{/}sgr).'.pm');
}

sub file_as_package_name
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
# //returns
#	?
{
	my $pkg_name = ($_[SPX_PKG_NAME] =~ s{/}{::}sgr);
	$pkg_name =~ s{\.\w+$}{}s;
	return($pkg_name);
}

sub dot_directory_from_file
# /type method
# /effect ""
# //parameters
#	pkg_file        ::Personality::Abstract::Text
# //returns
#	?
{
	my $pkg_file = $_[SPX_PKG_FILE];
	$writable_overlay->direct_read(\$pkg_file);
	return((($pkg_file =~ m{$re_carrot_dot_directory}so)
			? $1
			: $pkg_file)
		.'.');
}

sub pkg_n_sub
# /type method
# /effect ""
# //parameters
#	pkg_file        ::Personality::Abstract::Text
# //returns
#	?
{
	return($_[SPX_PKG_FILE] =~ m{$re_perl_pkg_n_sub}o);
}

sub resolve_placeholders
# /type method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
#	calling_pkg
# //returns
#	?
{
	my ($this, $pkg_name, $calling_pkg) = @ARGUMENTS;

	my $modified = IS_FALSE;
	$modified |= ($pkg_name =~ s{\[=perl_os_name=\]}{$OS_NAME}s);
	$modified |= ($pkg_name =~ s{\[=perl_version=\]}{$PERL_VERSION}s);

	if ($pkg_name =~ s{^\[=(this|parent|project|component)_pkg=\](::|$)}{}s)
	{
		my ($keyword, $end) = ($1, $2);
		my $value = $calling_pkg;
		if ($keyword eq 'this')
		{

		} elsif ($keyword eq 'parent')
		{
			$value =~ s{$re_perl_pkg_last_element}{}o;

		} elsif (($keyword eq 'project') or ($keyword eq 'component'))
		{
			$value = $pkg_tabulator
				->by_pkg_name($calling_pkg, $keyword);

#		} else {
# this is an assertion and doesn't justify $translated_errors
#			die("Internal error: the regexp matched but no case for '$keyword'.")

		}
		$pkg_name = "$value$end$pkg_name";
		$modified = IS_TRUE;
	}

	$_[SPX_PKG_NAME] = $pkg_name if ($modified);
	return($modified);
}



( run in 0.684 second using v1.01-cache-2.11-cpan-5b529ec07f3 )