Author: dylan
Date: 2004-06-28 02:01:04 -0400 (Mon, 28 Jun 2004)
New Revision: 273

Modified:
   trunk/main/client/lib/Haver/Client/Command.pm
Log:
Skeleton command parser, dispatcher.
Upon this we will build the kind of command thingy bdonlan wants.


Modified: trunk/main/client/lib/Haver/Client/Command.pm
===================================================================
--- trunk/main/client/lib/Haver/Client/Command.pm       2004-06-28 06:00:29 UTC 
(rev 272)
+++ trunk/main/client/lib/Haver/Client/Command.pm       2004-06-28 06:01:04 UTC 
(rev 273)
@@ -22,26 +22,17 @@
 use Carp qw(croak confess carp);
 
 use Haver::Preprocessor;
-use Text::ParseWords (); # we use parse_line.
-
 use Haver::Base;
 use base 'Haver::Base';
+use Haver::Callback;
 
-use Scalar::Util ();
+our $VERSION = 0.03;
 
-our $VERSION = '0.01';
-
 sub initialize {
        my ($me) = @_;
        
        $me->{chars}        ||= '/.';
-       $me->{alias_sep}    ||= ';';
-       $me->{expando_char} ||= '$';
-       $me->{say_cmd}      ||= 'say';
-       $me->{builtin_cmd}  ||= 'builtin';
-       $me->{alias}        ||= {};
-       $me->{vars}         ||= {};
-       $me->{command}      ||= {};
+       $me->{no_cmd}       ||= 'say';
 }
 
 
@@ -54,23 +45,18 @@
                $cmd = $1;
                $arg = $2;
        } else {
-               $cmd = $me->{say_cmd};
+               $cmd = $me->{no_cmd};
                $arg = $s;
        }
 
        return ($cmd, $arg);
 }
 
-sub invoke {
-       my ($me, $cmd, $arg) = @_;
-       
-}
-
-sub resolve_command {
+sub resolve {
        my ($me, $prefix) = @_;
        my $len = length $prefix;
        my %seen;
-       my @cmds = grep { not $seen{$_}++ } $me->commands, $me->aliases;
+       my @cmds = grep { not $seen{$_}++ } $me->commands;
        my @found;
 
        return $prefix if exists $seen{$prefix};
@@ -90,91 +76,23 @@
        }
 }
 
-### Methods for manipulating aliases.
-sub aliases {
-       my ($me) = @_;
-       my @a = keys %{ $me->{alias} };
-       
-       return wantarray ? @a : [EMAIL PROTECTED];
-}
+sub invoke {
+       my ($me, $cmd, $arg) = @_;
 
-sub alias {
-       my ($me, $alias, $text) = @_;
-       $me->{alias}{$alias} = $text;
+       $me->{command}{$cmd}->call($arg);
 }
 
-sub unalias {
-       my ($me, $alias) = @_;
-       delete $me->{alias}{$alias};
-}
-
-sub is_alias {
-       my ($me, $alias) = @_;
-
-       exists $me->{alias}{$alias};
-}
-
-sub eval_text {
-       my ($me, $text, $arg) = @_;
-       my $c    = quotemeta $me->{expando_char};
-       my $sep  = quotemeta $me->{alias_sep};
-       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([\w\*:$c-]+)/$me->expand($1, [EMAIL 
PROTECTED], $arg)/ge;
-               } else {
-                       $s .= ' ' . $arg;
-               }
-               push(@lines, $s);
+sub input {
+       my ($me, $s) = @_;
+       my ($cmd, $arg) = $me->parse($s);
+       ($cmd) = $me->resolve($cmd);
+       die "invalid command!" unless defined $cmd;
+       if (ref $cmd) {
+               $cmd = $cmd->[0];
        }
-
-       return @lines;
+       $me->invoke($cmd, $arg);
 }
 
-
-sub expand {
-       my ($me, $var, $args, $argstr) = @_;
-
-       if ($var =~ /^-?\d+$/) {
-               return $args->[$var];
-       } elsif ($var =~ /^(\d+)-(\d+)$/) {
-               return join(' ', @$args[$1 .. $2]);
-       } elsif ($var =~ /^(\d+)-$/) {
-               return join(' ', @$args[$1 .. $#$args]);
-       } elsif ($var eq '*') {
-               return $argstr || join(' ', @$args);
-       } elsif ($me->is_defined($var)) {
-               return $me->_value($var, $me->{vars}{$var});
-       } elsif (exists $ENV{$var}) {
-               return $ENV{$var};
-       } elsif ($var eq $me->{expando_char}) {
-               return $var;
-       } else {
-               return undef;
-       }
-}
-
-sub _value {
-       my ($me, $var, $val) = @_;
-
-       if (ref $val) {
-               if (ref($val) eq 'CODE') {
-                       $me->_value($var, $val->($me, $var));
-               } elsif (ref ($val) eq 'ARRAY') {
-                       return join(' ', @$val);
-               } else {
-                       return $val;
-               }
-       } else {
-               return $val;
-       }
-}
-
-### Method stubs for defining commands
 sub commands {
        my ($me) = @_;
        my @cmds = keys %{ $me->{command} };
@@ -182,8 +100,8 @@
 }
 
 sub register {
-       my ($me, $cmd, %opt) = @_;
-       $me->{command}{$cmd} = \%opt;
+       my ($me, $cmd, $cb) = @_;
+       $me->{command}{$cmd} = new Haver::Callback($cb);
 }
 
 sub unregister {
@@ -197,26 +115,5 @@
 }
 
 
-### Methods for defining $vars used in aliases.
-sub define {
-       my ($me, $var, $val) = @_;
 
-       $me->{vars}{$var} = $val;
-}
-
-sub undefine {
-       my ($me, $var) = @_;
-       
-       delete $me->{vars}{$var};
-}
-
-sub is_defined {
-       my ($me, $var) = @_;
-       
-       exists $me->{vars}{$var};
-}
-
-
-
 1;
-


Reply via email to