sub IRC::register {
my ($script_name, $version, $callback) = @_;
my $package = caller;
- $callback = Xchat::Embed::fix_callback( $package, $callback) if $callback;
+ $callback = Xchat::Embed::fix_callback( $package, undef, $callback) if $callback;
Xchat::register( $script_name, $version, undef, $callback );
}
my ($command, $callback) = @_;
my $package = caller;
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback( $package, undef, $callback );
# starting index for word_eol array
# this is for compatibility with '' as the command
sub IRC::add_message_handler {
my ($message, $callback) = @_;
my $package = caller;
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback( $package, undef, $callback );
Xchat::hook_server( $message,
sub {
sub IRC::add_print_handler {
my ($event, $callback) = @_;
my $package = caller;
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback( $package, undef, $callback );
Xchat::hook_print( $event,
sub {
my @word = @{$_[0]};
sub IRC::add_timeout_handler {
my ($timeout, $callback) = @_;
my $package = caller;
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback( $package, undef, $callback );
Xchat::hook_timer( $timeout,
sub {
no strict 'refs';
our @EXPORT_OK = @{$EXPORT_TAGS{all}};
sub register {
- my $package = Xchat::Embed::find_pkg();
+ my ($package, $calling_package) = Xchat::Embed::find_pkg();
my $pkg_info = Xchat::Embed::pkg_info( $package );
my $filename = $pkg_info->{filename};
my ($name, $version, $description, $callback) = @_;
}
$description = "" unless defined $description;
+ if( $callback ) {
+ $callback = Xchat::Embed::fix_callback(
+ $package, $calling_package, $callback
+ );
+ }
$pkg_info->{shutdown} = $callback;
unless( $name && $name =~ /[[:print:]\w]/ ) {
$name = "Not supplied";
my $message = shift;
my $callback = shift;
my $options = shift;
- my $package = Xchat::Embed::find_pkg();
+ my ($package, $calling_package) = Xchat::Embed::find_pkg();
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback(
+ $package, $calling_package, $callback
+ );
my ($priority, $data) = ( Xchat::PRI_NORM, undef );
_process_hook_options(
my $command = shift;
my $callback = shift;
my $options = shift;
- my $package = Xchat::Embed::find_pkg();
+ my ($package, $calling_package) = Xchat::Embed::find_pkg();
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback(
+ $package, $calling_package, $callback
+ );
my ($priority, $help_text, $data) = ( Xchat::PRI_NORM, undef, undef );
_process_hook_options(
my $event = shift;
my $callback = shift;
my $options = shift;
- my $package = Xchat::Embed::find_pkg();
+ my ($package, $calling_package) = Xchat::Embed::find_pkg();
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback(
+ $package, $calling_package, $callback
+ );
my ($priority, $run_after, $filter, $data) = ( Xchat::PRI_NORM, 0, 0, undef );
_process_hook_options(
sub hook_timer {
return undef unless @_ >= 2;
my ($timeout, $callback, $data) = @_;
- my $package = Xchat::Embed::find_pkg();
+ my ($package, $calling_package) = Xchat::Embed::find_pkg();
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ $callback = Xchat::Embed::fix_callback(
+ $package, $calling_package, $callback
+ );
if(
ref( $data ) eq 'HASH' && exists( $data->{data} )
my $fileno = fileno $fd;
return undef unless defined $fileno; # no underlying fd for this handle
- my $package = Xchat::Embed::find_pkg();
- $callback = Xchat::Embed::fix_callback( $package, $callback );
+ my ($package, $calling_package) = Xchat::Embed::find_pkg();
+ $callback = Xchat::Embed::fix_callback(
+ $package, $calling_package, $callback
+ );
my ($flags, $data) = (Xchat::FD_READ, undef);
_process_hook_options(
return @frame if $frame[0] !~ /(?:^IRC$|^Xchat)/;
$level++;
}
-
+ return;
}
sub find_pkg {
if( $frame[0] or $frame[1] ) {
my $calling_package = $frame[0];
if( defined( my $owner = $owner_package{ $calling_package } ) ) {
- return $owner;
+ return ($owner, $calling_package);
}
$location = $frame[1] ? $frame[1] : "package $frame[0]";
}
+# convert function names into code references
sub fix_callback {
- my ($package, $callback) = @_;
+ my ($package, $calling_package, $callback) = @_;
unless( ref $callback ) {
+ unless( $callback =~ /::/ ) {
+ my $prefix = defined $calling_package ? $calling_package : $package;
+ $callback =~ s/^/${prefix}::/;
+ }
+
no strict 'subs';
$callback = \&{$callback};
}