Author: dylan
Date: 2004-05-27 17:13:31 -0400 (Thu, 27 May 2004)
New Revision: 173

Modified:
   trunk/haver-client/lib/Haver/Client/Commands.pm
Log:
Commit, dammit.


Modified: trunk/haver-client/lib/Haver/Client/Commands.pm
===================================================================
--- trunk/haver-client/lib/Haver/Client/Commands.pm     2004-05-27 21:02:32 UTC 
(rev 172)
+++ trunk/haver-client/lib/Haver/Client/Commands.pm     2004-05-27 21:13:31 UTC 
(rev 173)
@@ -29,61 +29,160 @@
 sub initialize {
        my ($me) = @_;
        
-       $me->{chars}       ||= '/.';
-       $me->{default_cmd} ||= 'say';
+       $me->{chars}        ||= '/.';
+       $me->{alias_sep}    ||= ';';
+       $me->{expando_char} ||= '$';
+       $me->{say_cmd}      ||= 'say';
+       $me->{alias}        ||= {};
+       $me->{vars}         ||= {};
 }
 
+sub define {
+       my ($me, $var, $val) = @_;
 
-sub invoke {
+       $me->{vars}{$var} = $val;
+}
+
+sub undefine {
+       my ($me, $var) = @_;
+       
+       delete $me->{vars}{$var};
+}
+
+sub is_defined {
+       my ($me, $var) = @_;
+       
+       exists $me->{vars}{$var};
+}
+
+sub alias {
+       my ($me, $alias, $text) = @_;
+       $me->{alias}{$alias} = $text;
+}
+
+sub unalias {
+       my ($me, $alias) = @_;
+       delete $me->{alias}{$alias};
+}
+
+sub is_alias {
+       my ($me, $alias) = @_;
+
+       exists $me->{alias}{$alias};
+}
+
+sub eval_alias {
+       my ($me, $cmd, $arg) = @_;
+       my $c    = quotemeta $me->{expando_char};
+       my $sep  = quotemeta $me->{alias_sep};
+       my $text = $me->{alias}{$cmd};
+       my @cmds = grep(defined, Text::ParseWords::parse_line(qr/\s*$sep\s*/, 
1, $text));
+       my @lines;
+       
+
+       foreach my $s (@cmds) {
+               if ($text =~ /$c([0-9]|\*)/) {
+                       my @args = Text::ParseWords::parse_line(qr/\s+/, 0, 
$arg);
+                       $s =~ s/$c(\S+)/$me->expando($1, [EMAIL PROTECTED], 
$arg)/ge;
+               } else {
+                       $s .= ' ' . $arg;
+               }
+               push(@lines, $s);
+       }
+
+       return @lines;
+}
+
+sub expando {
+       my ($me, $var, $args, $argstr) = @_;
+
+       if ($var =~ /^\d+$/) {
+               return $args->[$var];
+       } elsif ($var eq '*') {
+               return $argstr;
+       } elsif ($me->is_defined($var)) {
+               return $me->{vars}{$var};
+       } elsif (exists $ENV{$var}) {
+               return $ENV{$var};
+       } elsif ($var eq $me->{expando_char}) {
+               return $var;
+       }
+}
+
+sub input {
        my ($me, $s) = @_;
-       my ($cmd, @args) = $me->parse($s);
-       my $method = "do_$cmd";
-       my $obj = $me->{invoke} || $me;
-       
-       if ($obj->can($method)) {
-               $obj->$method(@args);
+       my ($cmd, $arg) = $me->parse($s);
+
+       if ($me->is_alias($cmd)) {
+               my @lines = $me->eval_alias($cmd, $arg);
+               
+               foreach my $line (@lines) {
+                       $me->input($line);
+               }
        } else {
-               $obj->default_do($cmd, @args);
+               my @args = $me->parse_args($cmd, $arg);
+               $me->invoke($cmd, @args);
        }
 }
 
+sub invoke {
+       my ($me, $cmd, @args) = @_;
+
+       die "You must implement an invoke() method!";
+}
+
 sub parse {
        my ($me, $s) = @_;
        my $c = quotemeta $me->{chars};
        my ($cmd, $arg);
        
-       if ($s =~ /^[$c] (\w+) (?:\s*) (.+) $/x) {
+       if ($s =~ /^[$c] (\w+) (?:\s*) (.*) $/x) {
                $cmd = $1;
                $arg = $2;
        } else {
-               $cmd = $me->{default_cmd};
+               $cmd = $me->{say_cmd};
                $arg = $s;
        }
-       
-       if (my $code = $me->can("parse_$cmd")) {
-               return $code->($me, $cmd, $arg);
+
+       return ($cmd, $arg);
+}
+
+sub parse_args {
+       my ($me, $cmd, $arg) = @_;
+
+       if (my $code = $me->can("args_$cmd")) {
+               return $code->($me, $arg);
        } else {
-               return $me->default_parse($cmd, $arg);
+               return $me->default_args($cmd, $arg);
        }
+       
 }
 
-sub default_do {
-       my ($me, $cmd, @args) = @_;
-       die "You should at least overload the default_do method!";
-}
 
-sub default_parse {
+sub default_args {
        my ($me, $cmd, $arg) = @_;
-       return ($cmd, $arg);
+       return ($arg);
 }
 
-sub parse_raw {
-       my ($me, $cmd, $arg) = @_;
+sub args_msg {
+       my ($me, $arg) = @_;
+       my ($targ) = $arg =~ s/^\s*(\S+)\s+//;
+
+       return ($targ, $arg);
+}
+
+sub args_raw {
+       my ($me, $arg) = @_;
        my @args = grep(defined, Text::ParseWords::parse_line(qr/\s+/, 0, 
$arg));
-       return ($cmd, @args);
+       return (@args);
 }
 
+sub args_alias {
+       my ($me, $arg) = @_;
+       $arg =~ s/^\s*(\w+)\s+//;
+       
+       return ($1, $arg);
+}
 
-
 1;
 


Reply via email to