<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -127,7 +127,9 @@ class StructureProcessor &lt; SexpProcessor
     super_class = exp.shift
     body = exp.shift
     
-    record ClassCode.new(name, self.scope, body) do
+    name, temp_scope = process_colon2_constants(name) if name.is_a? Array
+    
+    record ClassCode.new(name, temp_scope || self.scope, body) do
       s(:class, name, process(super_class), process(body))
     end
   end
@@ -136,7 +138,9 @@ class StructureProcessor &lt; SexpProcessor
     name = exp.shift
     body = exp.shift
     
-    record ModuleCode.new(name, self.scope, body) do
+    name, temp_scope = process_colon2_constants(name) if name.is_a? Array
+    
+    record ModuleCode.new(name, temp_scope || self.scope, body) do
       s(:class, name, process(body))
     end
   end
@@ -186,6 +190,22 @@ class StructureProcessor &lt; SexpProcessor
   end
   
   protected
+  # If the class is defined as: A::B::C, then get the constants and register them.
+  # This is rather a dirty piece of code.  Fear it.
+  def process_colon2_constants(array)
+    array = array.flatten
+    constants = array[array.length/-2..-1]
+    name = constants.pop
+    
+    parent = self.scope
+    
+    constants.each do |c|
+      parent = record ModuleCode.new(c, parent, Sexp.new)
+    end
+        
+    [name,parent]
+  end
+  
   def record obj
     signature = obj.signature
     if !self.code_objects[signature]
@@ -196,7 +216,7 @@ class StructureProcessor &lt; SexpProcessor
     self.scope_stack &lt;&lt; self.code_objects[signature]
     result = yield if block_given?
     self.scope_stack.pop
-    result
+    result || obj
   end
   
   def scope</diff>
      <filename>lib/ruby_diff/structure_processor.rb</filename>
    </modified>
    <modified>
      <diff>@@ -95,13 +95,38 @@ class StructureProcessorTestCase &lt; Test::Unit::TestCase
     CODE
   end
   
+  def test_namespaced_class
+    assert_signatures &lt;&lt;-CODE, [&quot;C::B::A&quot;], [ClassCode]
+    class C::B::A
+    end
+    CODE
+  end
+  
+  def test_namespaced_module
+    assert_signatures &lt;&lt;-CODE, [&quot;C&quot;, &quot;C::B&quot;, &quot;C::B::A&quot;], [ModuleCode]
+    module C::B::A
+    end
+    CODE
+  end
+  
+  # Lets just be nuts...
+  def test_nested_namespaced_class
+    assert_signatures &lt;&lt;-CODE, [&quot;C&quot;, &quot;C::B&quot;, &quot;C::B::A&quot;, &quot;C::B::A::D&quot;], [ModuleCode, ClassCode]
+    module C::B::A
+      class D
+      end
+    end
+    CODE
+  end
+  
   def assert_signatures(code, signatures, types=[MethodCode])
     sexp = ParseTree.new.parse_tree_for_string(code)
+    serialized = sexp.pretty_inspect
     processor = StructureProcessor.new()
     processor.process(* sexp)
     
     found_signatures = processor.code_objects.values.select{|co| types.include?(co.class)}.map{|key| key.signature }.sort
-    assert_equal signatures.sort, found_signatures
+    assert_equal signatures.sort, found_signatures, &quot;Sexp was:\n#{serialized}&quot;
   end
   
 end</diff>
      <filename>test/structure_processor_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c283a51f36fceceed2ef21255f56108474fe88e2</id>
    </parent>
  </parents>
  <author>
    <name>Adam Sanderson</name>
    <email>netghost@gmail.com</email>
  </author>
  <url>http://github.com/adamsanderson/ruby_diff/commit/b6a116455d5051d84b16487b5cc1b27a3ac361b4</url>
  <id>b6a116455d5051d84b16487b5cc1b27a3ac361b4</id>
  <committed-date>2008-07-10T21:56:08-07:00</committed-date>
  <authored-date>2008-07-10T21:56:08-07:00</authored-date>
  <message>Added support for classes and modules defined with the &quot;::&quot; operator. ie: Breakfast::Pancake</message>
  <tree>d5bb7a1d7b94b93267b34f09aea7c0652002e454</tree>
  <committer>
    <name>Adam Sanderson</name>
    <email>netghost@gmail.com</email>
  </committer>
</commit>
