]> git.vpit.fr Git - perl/scripts/xchat.git/blobdiff - Xchat/XPI.pm
Make sure local_context() runs the code only when the context was found
[perl/scripts/xchat.git] / Xchat / XPI.pm
index f5a91d1b8f672013acf542402f5a57800efc1d19..0733175382a71dde90c6e0d775e1af8a7d818fa6 100644 (file)
@@ -7,44 +7,66 @@ use Tie::RefHash;
 
 use Xchat;
 
-our $VERSION = '0.03';
+use lib Xchat::get_info('xchatdir');
+use Xchat::XPI::Utils qw<called_from_script>;
+
+our $VERSION = '0.05';
 
 use constant { COLOR_TAG => "\00307" };
 
+my @attributes;
+BEGIN {
+ @attributes = qw<tag name version desc author email url banner>;
+}
+
+local *PH;
+
 sub new {
  my $class = shift;
- $class = ref($class) || $class || return;
- return if @_ % 2;
- my %opts = @_;
+ $class    = ref($class) || $class;
+ my %opts  = @_;
 
  my $caller = (caller 0)[0];
- $opts{tag}     ||= ($caller =~ /([^:]*):*$/) ? $1 : 'UNKNOWN';
- $opts{name}    ||= $opts{tag};
- $opts{desc}    ||= $opts{name};
- $opts{version} ||= do { no strict 'refs'; ${$caller.'::VERSION'} }
-                || '0.01';
-
- my $email = $opts{email};
- $email = '<' . $email . '>' if defined $email;
- my $desc = join ', ', grep defined, $opts{author}, $email, $opts{url};
- $desc = ' (' . $desc . ')' if length $desc;
- $opts{banner} = $opts{desc} . $desc;
+
+ unless (defined $opts{tag}) {
+  $opts{tag}     = ($caller =~ /([^:]*):*$/) ? $1 : 'UNKNOWN';
+ }
+ unless (defined $opts{name}) {
+  $opts{name}    = $opts{tag};
+ }
+ unless (defined $opts{desc}) {
+  $opts{desc}    = $opts{name};
+ }
+ unless (defined $opts{version}) {
+  my $version    = do { no strict 'refs'; ${$caller.'::VERSION'} };
+  $version       = '0.01' unless defined $version;
+  $opts{version} = $version;
+ }
+ unless (defined $opts{banner}) {
+  my $author     = defined $opts{author} ? $opts{author}    : 'unknown hacker';
+  my $email      = defined $opts{email}  ? "<$opts{email}>" : undef;
+  my $who        = join ', ', grep defined, $email, $opts{url};
+  $who           = " ($who)"  if length $who;
+  $opts{banner}  = $opts{desc} . " by $author$who";
+ }
 
  my $ph = bless \do { local *PH }, $class;
  tie *$ph, $ph, @_;
 
- *$ph->{$_}  = $opts{$_} for qw/tag name version desc author email url banner/;
+ *$ph->{$_}  = $opts{$_} for @attributes;
  *$ph->{buf} = '';
 
- Xchat::register(@opts{qw/name version banner/}, sub {
-  $ph->flush;
-  if (*$ph->{atexit_id}) {
-   my @callbacks = sort { *$ph->{atexit}{$b} <=> *$ph->{atexit}{$a} }
-                    keys %{*$ph->{atexit}};
-   $_->($ph) for @callbacks;
-  }
-  undef $ph;
- });
+ called_from_script {
+  Xchat::register(@opts{qw<name version banner>}, sub {
+   $ph->flush;
+   if (*$ph->{atexit_id}) {
+    my @callbacks = sort { *$ph->{atexit}{$b} <=> *$ph->{atexit}{$a} }
+                     keys %{*$ph->{atexit}};
+    $_->($ph) for @callbacks;
+   }
+   undef $ph;
+  })
+ };
  $ph->add_atexit($opts{unload}) if $opts{unload};
 
  $ph->print("\002", $ph->name, ' v', $ph->version,
@@ -53,21 +75,26 @@ sub new {
  return $ph;
 }
 
-eval "sub $_ { *\$_[0]->{$_} }"
-                          for qw/tag name version desc author email url banner/;
+BEGIN {
+ local $@;
+ eval "sub $_ { my \$ph = \$_[0]; *\$ph->{$_} }; 1" or die $@ for @attributes;
+}
 
 sub print {
  my $ph = shift;
- return unless $ph;
+
+ @_ = ($_) unless @_;
+
  my $ret  = 0;
- my $data = join '', *$ph->{buf},
-                     grep defined,
-                      (@_) ? @_ : ((defined) ? $_ : '');
+ my $data = join '', *$ph->{buf}, @_;
+
  while ((my $i = index $data, "\n") >= 0) {
   Xchat::print(COLOR_TAG . $ph->tag . "\t" . (substr $data, 0, ($i + 1), ''));
   $ret = 1;
  }
+
  *$ph->{buf} = $data;
+
  return $ret;
 }
 
@@ -75,47 +102,43 @@ sub printf { shift->print(sprintf @_) }
 
 sub flush {
  my ($ph) = @_;
- return unless $ph;
- $ph->print("\n") if length $ph->{buf};
+
+ if (length $ph->{buf}) {
+  $ph->print("\n");
+ } else {
+  return;
+ }
 }
 
 sub add_atexit {
  my ($ph, $callback) = @_;
- return unless $ph && $callback && ref $callback eq 'CODE';
+
  if (!*$ph->{atexit_id}) {
   tie my %h, 'Tie::RefHash';
   *$ph->{atexit} = \%h;
  }
+
  return *$ph->{atexit}{$callback} = ++*$ph->{atexit_id};
 }
 
 sub remove_atexit {
  my ($ph, $callback) = @_;
- return unless $ph && $callback;
+
  if (exists *$ph->{atexit}{$callback}) {
   delete *$ph->{atexit}{$callback};
   return 1;
  }
+
  return 0;
 }
 
 sub TIEHANDLE {
  my $ph = shift;
- ((defined $ph && $ph->isa(__PACKAGE__))
-  ? $ph
-  : shift->new(@_));
+ (defined $ph && $ph->isa(__PACKAGE__)) ? $ph : shift->new(@_);
 }
 
-sub PRINT { shift->print(@_) }
+sub PRINT  { shift->print(@_) }
 
 sub PRINTF { shift->printf(@_) }
 
-my $ph = __PACKAGE__->new(
- name   => 'Extended Xchat Perl Interface',
- desc   => 'Adds extended support for Perl scripts',
- author => 'Vincent Pit (VPIT)',
- email  => 'perl@profvince.com',
- url    => 'http://www.profvince.com',
-);
-
 1;