Visitors visits also child elements. LU added to directives.
diff --git a/plyproto/model.py b/plyproto/model.py
index bcff7ee..d2b7d80 100644
--- a/plyproto/model.py
+++ b/plyproto/model.py
@@ -35,9 +35,20 @@
     # visitor.visit_Literal(self)
     # visitor.visit_Name(self)
     # visitor.visit_Proto(self)
+    # visitor.visit_LU(self)
+
+class Base(object):
+    parent = None
+
+    def v(self, obj, visitor):
+        if obj == None:
+            return
+        if not hasattr(obj, "accept"):
+            return
+        obj.accept(visitor)
 
 # Lexical unit - contains lexspan and linespan for later analysis.
-class LU(object):
+class LU(Base):
     def __init__(self, p, idx):
         self.p = p
         self.idx = idx
@@ -70,14 +81,14 @@
         return self.describe()
 
     def accept(self, visitor):
-        pass
+        self.v(self.pval, visitor)
 
     def __iter__(self):
         for x in self.pval:
             yield x
 
 # Base node
-class SourceElement(object):
+class SourceElement(Base):
     '''
     A SourceElement is the base class for all elements that occur in a Protocol Buffers
     file parsed by plyproto.
@@ -150,7 +161,9 @@
         self.value = value
 
     def accept(self, visitor):
-        visitor.visit_FieldDirective(self)
+        if visitor.visit_FieldDirective(self):
+            self.v(self.name, visitor)
+            self.v(self.value, visitor)
 
 class FieldType(SourceElement):
     def __init__(self, name, linespan=None, lexspan=None, p=None):
@@ -159,7 +172,8 @@
         self.name = name
 
     def accept(self, visitor):
-        visitor.visit_FieldType(self)
+        if visitor.visit_FieldType(self):
+            self.v(self.name, visitor)
 
 class FieldDefinition(SourceElement):
     def __init__(self, field_modifier, ftype, name, fieldId, fieldDirective, linespan=None, lexspan=None, p=None):
@@ -172,7 +186,13 @@
         self.fieldDirective = fieldDirective
 
     def accept(self, visitor):
-        visitor.visit_FieldDefinition(self)
+        if visitor.visit_FieldDefinition(self):
+            self.v(self.name, visitor)
+            self.v(self.field_modifier, visitor)
+            self.v(self.ftype, visitor)
+            self.v(self.fieldId, visitor)
+            for s in self.fieldDirective:
+                self.v(s, visitor)
 
 class EnumFieldDefinition(SourceElement):
     def __init__(self, name, fieldId, linespan=None, lexspan=None, p=None):
@@ -182,7 +202,9 @@
         self.fieldId = fieldId
 
     def accept(self, visitor):
-        visitor.visit_EnumFieldDefinition(self)
+        if visitor.visit_EnumFieldDefinition(self):
+            self.v(self.name, visitor)
+            self.v(self.fieldId, visitor)
 
 class EnumDefinition(SourceElement):
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
@@ -193,6 +215,7 @@
 
     def accept(self, visitor):
         if visitor.visit_EnumDefinition(self):
+            self.v(self.name, visitor)
             for s in self.body:
                 s.accept(visitor)
 
@@ -205,6 +228,7 @@
 
     def accept(self, visitor):
         if visitor.visit_MessageDefinition(self):
+            self.v(self.name, visitor)
             for s in self.body:
                 s.accept(visitor)
 
@@ -217,6 +241,7 @@
 
     def accept(self, visitor):
         if visitor.visit_MessageExtension(self):
+            self.v(self.name, visitor)
             for s in self.body:
                 s.accept(visitor)
 
@@ -229,7 +254,10 @@
         self.name3 = name3
 
     def accept(self, visitor):
-        visitor.visit_MethodDefinition(self)
+        if visitor.visit_MethodDefinition(self):
+            self.v(self.name, visitor)
+            self.v(self.name2, visitor)
+            self.v(self.name3, visitor)
 
 class ServiceDefinition(SourceElement):
     def __init__(self, name, body, linespan=None, lexspan=None, p=None):
@@ -240,6 +268,7 @@
 
     def accept(self, visitor):
         if visitor.visit_ServiceDefinition(self):
+            self.v(self.name, visitor)
             for s in self.body:
                 s.accept(visitor)
 
@@ -254,7 +283,9 @@
         self.toVal = toVal
 
     def accept(self, visitor):
-        visitor.visit_ExtensionsDirective(self)
+        if visitor.visit_ExtensionsDirective(self):
+            self.v(self.fromVal, visitor)
+            self.v(self.toVal, visitor)
 
 class Literal(SourceElement):
 
@@ -321,5 +352,6 @@
 
     def accept(self, visitor):
         if visitor.visit_Proto(self):
+            self.v(self.pkg, visitor)
             for s in self.body:
                 s.accept(visitor)
diff --git a/plyproto/parser.py b/plyproto/parser.py
index b827ab0..e75eb52 100755
--- a/plyproto/parser.py
+++ b/plyproto/parser.py
@@ -175,9 +175,9 @@
         '''field_directive_plus : field_directive
                                | field_directive_plus field_directive'''
         if len(p) == 2:
-            p[0] = [p[1]]
+            p[0] = [LU(p,1)]
         else:
-            p[0] = p[1] + [p[2]]
+            p[0] = p[1] + [LU(p,2)]
 
     def p_dotname(self, p):
         '''dotname : NAME