#!/usr/bin/perl
#use Mooix::Thing;
run sub {
	my $this=shift;
	%_=@_;
	my $message=lc(shift);
	$message=~s/[^-A-Za-z0-9_]//g;

	my @packages;
	my %package2field;
	foreach my $field ($this->mcpsession_packages) {
		my $obj=$this->$field;
		next unless ref $obj;
		my $package=$obj->package;
		next unless $message=~/^\Q$package\E/;
		$package2field{$package}=$field;
		push @packages, $package;
	}

	# Order packages by name, with the longest (and therefore most
	# specific) names first.
	@packages = sort { length($a) <=> length($b) || $a cmp $b } @packages;
	
	foreach my $package (@packages) {
		my $method=$message;
		$method=~s/^\Q$package\E[_-]//;
		# The mcp session object need not be enabled to get the mcp
		# message, since that message enables it.
		if ($method ne 'mcp' || length $package) {
			my $enabled=$package2field{$package}."_enabled";
			return unless $this->$enabled;
		}
		my $callback=$package2field{$package}."_receive_$method";
		if ($this->implements($callback)) {
			return $this->$callback(@_);
		}
	}

	return;
}
