Index: /trunk/PS-IPP-Metadata-Config/lib/PS/IPP/Metadata/Config.pm
===================================================================
--- /trunk/PS-IPP-Metadata-Config/lib/PS/IPP/Metadata/Config.pm	(revision 3421)
+++ /trunk/PS-IPP-Metadata-Config/lib/PS/IPP/Metadata/Config.pm	(revision 3422)
@@ -1,5 +1,5 @@
 # Copyright (c) 2005  Joshua Hoblitt
 #
-# $Id: Config.pm,v 1.3 2005-03-09 23:44:18 jhoblitt Exp $
+# $Id: Config.pm,v 1.4 2005-03-15 04:44:01 jhoblitt Exp $
 
 package PS::IPP::Metadata::Config;
@@ -25,7 +25,5 @@
     my $class = shift;
 
-    my $myparser = Parse::RecDescent->new( $grammar );
-
-    my $self = { _parser => $myparser };
+    my $self = {};
 
     bless $self, $class;
@@ -39,5 +37,5 @@
     my ( $self, $metadata ) = @_;
 
-    my $tree = $self->{_parser}->startrule( $metadata );
+    my $tree = Parse::RecDescent->new( $grammar )->startrule( $metadata );
 
     return undef unless defined $tree;
@@ -203,9 +201,6 @@
     | metadata
     | blank_line
-#    | {
-#        use Carp qw( croak );
-#        $text =~ /([^\n]*)/;
-#        croak "Invalid statement at line $thisline near \"$1\"";
-#    }
+    | typedef_declare
+    | typedef
 
 scalar:
@@ -260,5 +255,5 @@
 
 metadata:
-    metadata_name grammar metadata_end
+    metadata_name <commit> grammar metadata_end
         {{
             class   => 'metadata',
@@ -273,4 +268,53 @@
             comment => $item{comment},
         }}
+
+typedef_declare:
+    <skip:'[ \t\r]*'> 'TYPE' <commit> name name(s) "\n"
+        {
+            use Carp;
+
+            my $len = scalar @{ $item{'name(s)'} };
+
+            if (defined $thisparser->{local}{typedef}{ $item{name} }) {
+                croak "refinition of TYPE $item{name}";    
+            }
+
+            $thisparser->{local}{typedef}{ $item{name} } = $len;
+
+            $return = {
+                class   => 'typedef_declare',
+                name    => $item{name},
+                value   => $item{'name(s)'},
+            };
+        }
+    | <skip:'[ \t\r]*'> 'TYPE' <commit> name name(s) comment "\n"
+        {{
+            class   => 'typedef_declare',
+            name    => $item{name},
+            value   => $item{'name(s)'},
+            comment => $item{comment},
+        }}
+
+typedef:
+    <skip:'[ \t\r]*'> name typedef_type name(s) "\n"
+        {
+            $return = {
+                class   => 'typedef',
+                name    => $item{name},
+                type    => $item{typedef_type},
+                value   => $item{'name(s)'},
+            };
+        }
+
+typedef_type: name
+        {
+            use Carp;
+
+            if ( ! defined $thisparser->{local}{typedef}{ $item{name} } ) {
+                croak "missing TYPE defintion for $item{name}";
+            }
+
+            $return = $item{name};
+        }
 
 metadata_name:
@@ -286,5 +330,5 @@
 
 name:
-    /[a-z][.\w]*/i
+    /[a-z][.\w-]*/i
 
 vname:
