use strict; use Irssi; use Irssi::TextUI; # for sbar_items_redraw use vars qw($VERSION %IRSSI); $VERSION = "0.1"; %IRSSI = ( authors => "shabble", contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', name => "", description => "", license => "Public Domain", changed => "" ); my $functions = {}; init(); sub _input { return int rand 1000; } sub load { my $file = shift; my $funcs; if (-f $file) { print "Loading from file: $file"; $funcs = do $file; } if (not defined $funcs) { if ($@) { print "failed to parse $file: $@"; } elsif ($!) { print "failed to read $file: $!"; } return; } my $ref = ref $funcs; if ($ref ne 'HASH') { print "$file didn't return a hashref: ", defined $ref ? $ref : 'undef'; return; } foreach my $name (keys %$funcs) { my $func = $funcs->{$name}; if (exists $functions->{$name}) { print "Redefining function $name"; } else { print "adding function: $name"; } $functions->{$name} = $func; } print "Loaded " . scalar(keys(%$funcs)) . " functions"; } sub init { Irssi::command_bind('subload', \&cmd_subload); Irssi::command_bind('sublist', \&cmd_sublist); Irssi::command_bind('subcall', \&cmd_subcall); } sub cmd_subload { my $args = shift; print "Going to load: $args"; load($args); } sub cmd_sublist { foreach my $name (keys %$functions) { my $func = $functions->{$name}; print "Function: $name => $func"; } } sub cmd_subcall { my $args = shift; my ($cmd, $cmdargs); if ($args =~ m/^(\w+\b)(.*)$/) { $cmd = $1; $cmdargs = $2; } else { print "Couldn't parse $args"; return; } my $fun = $functions->{$cmd}; if (ref $fun eq 'CODE') { print "Calling $cmd with $cmdargs"; $fun->($cmdargs); } else { print "$cmd is not a coderef. cannot run"; } }