Carrot

 view release on metacpan or  search on metacpan

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

# /type method
# /effect "Fills an newly constructed instance with life."
# //parameters
# //returns
{
	my $this = [];
	$this->[ATR_IDS] = {};
	$this->[ATR_COUNTER] = 0;
	$this->[ATR_CALLBACKS] = {};
	$this->[ATR_UPGRADES] = {};

	foreach my $key (keys(%INC))
	{
		$this->[ATR_COUNTER] += 1;
		$key = $pkg_patterns->file_as_package_name($key);
		$this->[ATR_IDS]{$key} = $this->[ATR_COUNTER];
	}
	bless($this, $_[SPX_CLASS]);

	return($this);
}

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

	if (exists($this->[ATR_IDS]{$_[SPX_PKG_NAME]}))
	{
		return($this->[ATR_IDS]{$_[SPX_PKG_NAME]});
	} else {
		return(IS_UNDEFINED);
	}

}

sub evt_package_load_after
# /type method
# /effect ""
# //parameters
#	pkg_name
# //returns
{
	my ($this, $pkg_name) = @ARGUMENTS;

	my $package_ids = $this->[ATR_IDS];
	unless (exists($package_ids->{$pkg_name}))
	{
		$this->[ATR_COUNTER] += 1;
		$package_ids->{$pkg_name} = $this->[ATR_COUNTER];
	}
	if (exists($this->[ATR_CALLBACKS]{$pkg_name}))
	{
		if (TRACE_FLAG)
		{
			print STDERR "Executing callbacks for package '$pkg_name'.\n";
		}
		my $callbacks = delete($this->[ATR_CALLBACKS]{$pkg_name});
		foreach my $callback (@$callbacks)
		{
			$callback->($pkg_name);
		}
	}
	if (exists($this->[ATR_UPGRADES]{$pkg_name}))
	{
		if (TRACE_FLAG)
		{
			print STDERR "Executing upgrades for package '$pkg_name'.\n";
		}
		my $instances = delete($this->[ATR_UPGRADES]{$pkg_name});
		if ($pkg_name->can('re_constructor'))
		{
			$_->re_constructor($pkg_name) foreach (@$instances);
		} else {
			bless($_, $pkg_name) foreach (@$instances);
		}
	}

	return;
}

sub subscribe_upgrade
# /type method
# /effect ""
# //parameters
#	pkg_name
#	instance
# //returns
{
	my ($this, $pkg_name, $instance) = @ARGUMENTS;

	my $upgrades = $this->[ATR_UPGRADES];
	unless (exists($upgrades->{$pkg_name}))
	{
		$upgrades->{$pkg_name} = [];
	}
	push($upgrades->{$pkg_name}, $instance);
	return;
}

sub subscribe_callback
# /type class_method
# /effect ""
# //parameters
#	pkg_name        ::Personality::Abstract::Text
#	callback
# //returns
{
	my ($this, $pkg_name, $callback) = @ARGUMENTS;

	if (TRACE_FLAG)
	{
		print STDERR "Request to callback for package '$pkg_name'.\n";
	}
	if (exists($this->[ATR_IDS]{$pkg_name}))
	{
		$callback->($pkg_name);
		return;
	}
	my $callbacks = $this->[ATR_CALLBACKS];
	unless (exists($callbacks->{$pkg_name}))
	{
		$callbacks->{$pkg_name} = [];
	}
	push($callbacks->{$pkg_name}, $callback);

	return;
}

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

	return(PERL_FILE_LOADED);
}
# //revision_control
#	version 1.1.331
#	branch main
#	maturity alpha
# /license MPL-2.0 (Mozilla Public License v2.0)
# /copyright "(C) 2009-2014 Winfried Trümper <win@carrot-programming.org>"



( run in 0.675 second using v1.01-cache-2.11-cpan-f56aa216473 )