<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>TODO</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/persistance/persistance/bigtable_driver.rb</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/ui/element/element_test.rb</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/ui/element/field_composite.rb</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/ui/element/field_composite_composition_test.rb</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/ui/element/field_composite_test.rb</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/ui/element/submit_button_test.rb</filename>
    </added>
    <added>
      <filename>pocket_ruby/fw/util/devtools/development_tools.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -11,17 +11,18 @@ module PocketRuby
       }
     end
 
-    def self.generate_id
-      (Time.now.to_i.to_s+(rand()*10000000.0).floor.to_s).to_i.to_s(32)
-    end
-
-
     def self.serialize object
       serialized = {
         :class =&gt; object.class.to_s,
         :fields =&gt; extract_attributes(object)
       }
-      serialized = serialized.to_yaml
+      
+      begin
+        serialized = serialized.to_yaml
+      rescue 
+        raise &quot;Cannot serialize data: #{serialized.inspect}. &quot; + $!.message
+      end
+      
       Event.fire('persistance:serialize', serialized)
       serialized
     end
@@ -31,10 +32,11 @@ module PocketRuby
         raise &quot;Class '#{object.class}' is not mapping enabled.&quot;
       end
       extracted = {}
-      attributes.each { |k|
-        v = object.send(k)
-        if v.respond_to? 'get_raw'
-          v = v.get_raw
+      attributes.each { |k|        
+        if block = Block.get(k, object)
+          v = block.get_raw
+        else
+          v = object.send(k)
         end
         extracted[k] = v
       }
@@ -65,5 +67,9 @@ module PocketRuby
       @@classes[klass] ||= {}
       @@classes[klass][field.to_s] = true
     end
+
+
   end
+
+
 end
\ No newline at end of file</diff>
      <filename>pocket_ruby/fw/persistance/persistance/persistance.rb</filename>
    </modified>
    <modified>
      <diff>@@ -44,15 +44,23 @@ class PersistanceTest &lt; Test::Unit::TestCase
   end
 
   def test_extracting_attributes_uses_get_raw_to_get_raw_data
-    attribute = Class.new {
+    attribute = Class.new(Block) {
         define_method(:get_raw) {
           'raw data'
         }
       }
-    o = MyObject.new
-    o.name = attribute.new
-    assert o.name.respond_to? 'get_raw'
-    assert_equal({'name' =&gt; 'raw data', 'id' =&gt; nil}, Persistance.extract_attributes(o))
+    record_class = Class.new(Record) {
+      Block.describe(self,{
+        :name =&gt; attribute
+      })
+    }
+
+    record = record_class.new
+
+    assert_equal({
+        'name' =&gt; 'raw data',
+        'id' =&gt; nil
+      }, Persistance.extract_attributes(record))
   end
 
 end</diff>
      <filename>pocket_ruby/fw/persistance/persistance/persistance_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,33 +17,36 @@ module PocketRuby
     end
 
     def name_slot object
-      if object.id.nil? || object.id == ''
-        raise &quot;Cannot save object with empty id #{object.id.inspect}.&quot;
+      if object.id.nil? || object.id === ''
+        raise &quot;Cannot save #{object.inspect} with empty id: #{object.id.inspect}.&quot;
       end
       object.class.to_s.gsub('::', '.')+'/'+object.id.to_s
     end
 
     def serialize_and_store object
       content = Persistance.serialize(object)
-
       dir = name_slot object
 
-      storage.write(&quot;#{dir}/#{object.id}.txt&quot;, content)
+      storage.write(&quot;#{dir}/#{Repository.guid}.txt&quot;, content)
       storage.write(&quot;#{dir}/head.txt&quot;, content)
     end
 
     def fill_repository
       storage.dirs_in('.').each { |folder|
         storage.dirs_in(folder).each { |item_folder|
-          revive storage.read(folder+'/'+item_folder+'/head.txt')
+          begin
+            file = folder+'/'+item_folder+'/head.txt'
+            puts &quot;REVIVING #{file}&quot;
+            revive storage.read(file)
+          rescue
+            puts $!.to_s+&quot;\n&quot;+$!.backtrace.join(&quot;\n&quot;)
+          end
         }
       }
     end
 
     def revive content
       repository.add(Persistance.unserialize(content))
-    rescue
-      p Magic.wrap(&quot;Could not revive item.&quot;, $!)
     end
   end
 end
\ No newline at end of file</diff>
      <filename>pocket_ruby/fw/persistance/persistance/storage_mapping.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,6 @@ class StorageMappingTest &lt; Test::Unit::TestCase
     mapping.storage = Storage.new('', MemoryStorageDriver.new)
     repo.persist(object)
 
-
     repo = Repository.new
     mapping.repository = repo
     mapping.fill_repository
@@ -30,6 +29,32 @@ class StorageMappingTest &lt; Test::Unit::TestCase
     assert_equal object.name, repo.select {|i| true}.first.name
   end
 
+
+  def test_persist_persists_record_into_repo
+    object = MyRecord.new
+    object.name = &quot;the name lalala&quot;
+
+    repo = Repository.new
+    mapping = StorageMapping.new()
+    mapping.repository = repo
+    mapping.storage = Storage.new('', MemoryStorageDriver.new)
+    repo.persist(object)
+    assert_equal [object], repo.select {|i| true}
+  end
+
+  def test_persisting_items_sets_their_id
+    object = MyRecord.new
+    object.name = &quot;the name lalala&quot;
+
+    repo = Repository.new
+    mapping = StorageMapping.new()
+    mapping.repository = repo
+    mapping.storage = Storage.new('', MemoryStorageDriver.new)
+    repo.persist(object)
+    assert !object.id.nil?
+    assert object.id.length &gt; 3
+  end
+
   def test_storage_mapping_mapps_object_into_same_slot_every_time
     mapping = StorageMapping.new()
     o = Object.new
@@ -37,17 +62,6 @@ class StorageMappingTest &lt; Test::Unit::TestCase
     assert_equal mapping.name_slot(o), name1
   end
 
-  def test_saving_object_with_empty_id_causes_exception
-    mapping = StorageMapping.new()
-    o = Object.new
-    o.send(:instance_eval, &quot;def id
-      '' #ha ha!
-    end&quot;)
-    assert_equal &quot;&quot;, o.id
-    assert_raise(RuntimeError) {
-      mapping.name_slot(o)
-    }
-  end
 
   def test_real_integration
     #p @repo</diff>
      <filename>pocket_ruby/fw/persistance/persistance/storage_mapping_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ module PocketRuby
     @@persisted_attributes ||= {}
 
 
-    @@finders_collection = nil
+    @@finders_collection ||= nil
 
     def self.find
       @@finders_collection ||= {}
@@ -54,14 +54,22 @@ module PocketRuby
     persist :id
 
     def id
-      @id ||= Persistance.generate_id
+      @id
+    end
+
+    def id= id
+      if id == nil || id == ''
+        raise &quot;Cannot unset id for record #{self.inspect}.&quot;
+      else
+        @id = id
+      end
     end
 
     def attributes= values
       values.each { |field, v|
         m = field.to_s+'='
         if !self.methods.include? m
-          raise &quot;The #{self.class} record doesn\'t contain setter for #{field.inspect}.&quot;
+          raise &quot;Cannot set values: #{values.inspect}.\n The #{self.class} record doesn\'t contain setter for #{field.inspect}.&quot;
         end
         send(m, v)
       }
@@ -70,7 +78,11 @@ module PocketRuby
     def attributes
       attrs = {}
       self.class.presisted_attributes.each { |field|
-        attrs[field] = self.send(field)
+        v = self.send(field)
+        if v.respond_to? :get
+          v = v.get
+        end
+        attrs[field] = v
       }
       attrs
     end
@@ -79,6 +91,12 @@ module PocketRuby
       create_behaviour 'Public'
     end
 
+    def public
+      b = (create_behaviour 'Public')
+      b.record_instance = self
+      b
+    end
+
     def self.create_behaviour kind
       if self.constants.include? kind
         self.const_get(kind).new(self)</diff>
      <filename>pocket_ruby/fw/persistance/record/record.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,15 +4,15 @@ module PocketRuby
     class RecordBehaviourForm &lt; Form
       def initialize
         super()
-        add InputHidden.new :name =&gt; 'id'
-        add(@record_class_field = InputHidden.new(:name =&gt; 'record'))
+        @id_field = add(@record_id_field = InputHidden.new(:name =&gt; 'id'))
+        @record_field = add(@record_class_field = InputHidden.new(:name =&gt; 'record'))
       end
 
       def recieve a
         record_class = Magic.to_const(a['record'])
         @record_class = record_class
         if id = a['id']
-          record = record_class.find.all {|r| r.id == id }[0]
+          record = record_class.find.by_id(id)
         end
         record ||= record_class.new
         self.record = record
@@ -20,6 +20,8 @@ module PocketRuby
       end
 
       def record= record
+        @record = record
+        @record_id_field.value = record.id
         @record_class_field.value = record.class.to_s
         @record_class = record.class
         if @record_fields
@@ -28,23 +30,29 @@ module PocketRuby
         @record_fields = []
 
         Block.fields_of(record.class).each { |f|
-          field = record.send(f)
-          if field.respond_to?('form_element') &amp;&amp; (e = field.form_element)
+          field = Block.get(f, record)
+          if field.respond_to?('form_element') &amp;&amp; (e = field.create_form_element)
             @record_fields &lt;&lt; e
             add e
           end
         }
       end
 
+      def record
+        @record
+      end
+
       def template
         form = self
         lambda {
           add(form.element) do
             form.fields.each do |e|
-              if e.is_visible?
+              if e.visible?
                 p form.label(e.name, e.name)
-              end
-              p e.to_s
+                p e.to_s
+              else
+                add e.to_s
+              end              
             end
             add SubmitButton.new(:name =&gt; 'submit', :value =&gt; 'submit')
           end
@@ -52,27 +60,64 @@ module PocketRuby
       end
 
       def get_record
-        post = dump
-        record = @record_class.find.by_id(post['id'])
-        record ||= @record_class.new
-        post.delete('record')
-        record.attributes = post
-        record
+#        id = @id_field.value
+#        data = dump
+#
+#        p data
+#
+#        @record_class ||= Magic.to_const(@record_field.value)
+#
+#        r = nil
+#
+#        if !id.nil? &amp;&amp; id != ''
+#          if r = @record_class.find.by_id(id)
+#            self.record = r
+#            self.recieve(data)
+#            data = dump
+#          else
+#            raise &quot;Record with id #{id.inspect} not found.&quot;
+#          end
+#        else
+#          data.delete('id')
+#        end
+#        data.delete('record')
+#
+#        if r.nil?
+#          r = @record_class.new
+#          self.record = r
+#        end
+#
+#
+#
+        data = dump
+        data.delete('record')
+        data.delete('id')
+
+        r = record
+        r.attributes = data
+        r
       end
 
       def on_success
+        super
 #        begin
 #          raise 'aa'
 #        rescue
 #          p $!.backtrace.join(&quot;\n&quot;)
 #        end
 #        p post
-        get_record.save
+        r = get_record
+        r.save
+        #puts ''
+        #p &quot;attrs after save&quot;
+        #p record.attributes
+        #puts '---------------'
+        #puts ''
       end
     end
     
 
-    class BehaviourNode &lt; SiteNode
+    class BehaviourNode &lt; SiteLeaf
       attr_accessor :behaviour
       
       def initialize behaviour
@@ -111,10 +156,9 @@ module PocketRuby
     end
 
 
-    class List &lt; SiteNode
+    class List &lt; BehaviourNode
       def initialize behaviour
-        super()
-        @behaviour = behaviour
+        super
         self.view = behaviour.class.const_get('ListView')
         map :show =&gt; behaviour.show
         map :edit =&gt; behaviour.edit
@@ -202,7 +246,7 @@ module PocketRuby
   class ShowView &lt; View
     def template
       lambda {
-         Block.fields_of(@behaviour.record_class).each { |f|
+         Block.fields_of(@record.class).each { |f|
            p {strong f}
            add(&amp;@record.send(f).template)
         }
@@ -213,25 +257,29 @@ module PocketRuby
 
 
     attr_accessor :record_class
+    attr_accessor :record_instance
 
     def initialize(record_class = nil)
       @record_class = record_class || self.class.const_get(self.class.to_s.split('::')[-2])
+      if record_class.nil?
+         raise &quot;No record set for #{self.class}&quot;
+      end
     end
 
     def list
-      @list ||= self.class.const_get('List').new(self)
+      self.class.const_get('List').new(self)
     end
 
     def show
-      @show ||= self.class.const_get('Show').new(self)
+      self.class.const_get('Show').new(self)
     end
 
     def new
-      @new ||= self.class.const_get('New').new(self)
+      self.class.const_get('New').new(self)
     end
 
     def edit
-      @edit ||= self.class.const_get('Edit').new(self)
+      self.class.const_get('Edit').new(self)
     end
 
     def form</diff>
      <filename>pocket_ruby/fw/persistance/record/record_behaviour.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,11 +2,13 @@
 
 class RecordBehaviourFormTest &lt; Test::Unit::TestCase
   include PocketRuby
+  class RbForm &lt; RecordBehaviour::RecordBehaviourForm
+    
+  end
 
   class Soul &lt; Record
     Block.describe(self, {
-        :name =&gt; Title,
-        :owner =&gt; BelongsTo.new(self)
+        :name =&gt; Title
       })
   end
 
@@ -14,6 +16,67 @@ class RecordBehaviourFormTest &lt; Test::Unit::TestCase
     Soul.repository = Repository.new()
   end
 
+  def test_set_crucial_values_of_saved_record
+    brett = Soul.new(:name =&gt; 'Brett') # Brett is the boom king
+    brett.save
+    form = RbForm.new
+    form.record = brett
+    data = form.dump
+    assert_equal 'Brett', data['name']
+    assert_equal brett.id, data['id']
+    assert_equal 'RecordBehaviourFormTest::Soul', data['record']
+  end
+
+  def test_set_crucial_values_of_new_record
+    brett = Soul.new(:name =&gt; 'Brett') # Brett is the boom king
+    form = RbForm.new
+    form.record = brett
+    data = form.dump
+    assert_equal 'Brett', data['name']
+    assert_equal 'RecordBehaviourFormTest::Soul', data['record']
+  end
+
+  def test_get_existing_record
+    brett = Soul.new(:name =&gt; 'Brett') # Brett is the boom king
+    brett.save
+
+    form = RbForm.new
+    form.record = brett
+
+    form2 = RbForm.new
+    form2.recieve(form.dump)
+    assert_equal brett, form2.get_record
+  end
+
+  def test_get_new_record
+    brett = Soul.new(:name =&gt; 'Brett') # Brett is the boom king
+    form = RbForm.new
+    form.record = brett
+    data = form.dump
+    assert_equal 'Brett', data['name']
+
+    form2 = RbForm.new
+    form2.recieve(data)
+    assert_equal 'Brett', form2.get_record.name
+  end
+
+
+  def test_dump_works
+    brett = Soul.new(:name =&gt; 'Brett') # Brett is the boom king
+    form = RbForm.new
+    form.record = brett
+    data = form.dump
+    assert_equal 'Brett', data['name']
+  end
+
+  def test_recieve_works
+    form = RbForm.new
+    form.recieve({'name' =&gt; 'Brett', 'record' =&gt; Soul.to_s})
+    soul = form.get_record
+    assert_equal 'Brett', soul.name
+  end
+
+
   def test_we_can_construct_the_form_and_get_back_object_with_same_attributes
     assert true
 #    frank = Soul.new(:name =&gt; 'frank')</diff>
      <filename>pocket_ruby/fw/persistance/record/record_behaviour_form_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,7 @@ module PocketRuby
         r.class.ancestors.include? @record_class
       }
 
-      add :all =&gt; Query.new(&amp;@correct_class)
+      #add :all =&gt; Query.new(&amp;@correct_class)
     end
 
     def by_id id
@@ -25,6 +25,14 @@ module PocketRuby
       (use Query.new(&amp;@correct_class).and(key, :eq, value))
     end
 
+    def first
+      (use Query.new(&amp;@correct_class)).first
+    end
+
+    def all
+      (use Query.new(&amp;@correct_class))
+    end
+
     def use query
       begin
         @finder.result(query)</diff>
      <filename>pocket_ruby/fw/persistance/record/record_finders.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,10 +19,10 @@ module PocketRuby
 
     def on_success
       post = dump
-      123
       record = @record_class.find.all.select { |i|
           i.id == post['id']
         }[0] || @record_class.new
+      post.delete('id')
       record.attributes = post
       record.save
     end
@@ -33,10 +33,10 @@ module PocketRuby
       lambda {
         add(form.element) do
           form.fields.each do |e|
-            if e.is_visible?
+            if e.visible?
               p form.label(e.name, e.name)
             end
-            p e.to_s
+            add e.to_s
           end
           add SubmitButton.new(:name =&gt; 'submit', :value =&gt; 'submit')
         end</diff>
      <filename>pocket_ruby/fw/persistance/record/record_form.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,6 +10,10 @@ class RecordTest &lt; Test::Unit::TestCase
   class MyRecordSubclass &lt; MyRecord
   end
 
+  def setup
+    MyRecord.repository = Repository.new
+  end
+
 
   def test_presisted_attributes_returns_names_of_persisted_attributes
     assert MyRecord.presisted_attributes.include?('name'), MyRecord.presisted_attributes.inspect+&quot; does not include 'name'.&quot;
@@ -24,9 +28,14 @@ class RecordTest &lt; Test::Unit::TestCase
     assert_equal 'subclass', sc.attributes['name']
   end
 
-  def test_records_have_generated_ids_from_start
-    assert MyRecord.new.id.length &gt; 3
-    assert MyRecord.new.attributes()['id'].length &gt; 3
+  def test_new_record_ids_are_nil
+    assert_equal nil, MyRecord.new.id
+  end
+
+  def test_records_id_can_be_set
+    r = MyRecord.new
+    r.id = &quot;abcd&quot;
+    assert_equal &quot;abcd&quot;, r.id
   end
 
   def test_record_provides_find_method</diff>
      <filename>pocket_ruby/fw/persistance/record/record_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,7 @@ module PocketRuby
 
     # Adds object to repo and triggers persistance
     def persist object
+      object.id ||= self.class.guid
       fire('persist', object)
       Event.fire('repository:persist', object)
       add object
@@ -31,6 +32,10 @@ module PocketRuby
       @objects.values.select(&amp;block)
     end
 
+    def self.guid
+      (Time.now.to_i.to_s+(rand()*10000000.0).floor.to_s).to_i.to_s(32)
+    end
+
   end
 
 end
\ No newline at end of file</diff>
      <filename>pocket_ruby/fw/persistance/repository.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,29 @@
 module PocketRuby
 
-  def puts string, escape = true
-    if escape
-      string = CGI.escapeHTML(string)
+    def self.attr *a
+      a.each do |attr_name|
+        define_method(attr_name.to_s) do |*a|
+          if a.length == 1
+            instance_variable_set('@'+attr_name.to_s, a[0])
+            return self
+          else
+            instance_variable_get('@'+attr_name.to_s)
+          end
+        end
+      end
     end
-    super(string+'&lt;br&gt;')
-  end
 
-  def p object, escape = true
-    puts(object.inspect, escape)
-  end
+    
+#  def puts string, escape = true
+#    if escape
+#      string = CGI.escapeHTML(string)
+#    end
+#    super(string+'&lt;br&gt;')
+#  end
+#
+#  def p object, escape = true
+#    puts(object.inspect, escape)
+#  end
 
 
   @@root = File.dirname(File.dirname(__FILE__))
@@ -28,7 +42,7 @@ module PocketRuby
 
     Loader::Load.set_root(@@root)
     Loader::Load.blacklist.add(/_test\.rb$/)
-    Loader::Load.blacklist.add(/^test$/)
+    Loader::Load.seek.folder_blacklist.add(/^test$/)
     Loader::Load.blacklist.add(/^_/)
 
     Loader::Load.load_dir('/fw')</diff>
      <filename>pocket_ruby/fw/pocket_ruby.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,19 +1,21 @@
 require 'stringio'
 
 module PocketRuby
-  ENV = 'development'
+  @@ENV ||= 'development'
 
   class Runner
 
-    attr_accessor :ruby_home
+    @@apps ||= {}
+    attr_accessor :ruby_home, :on_app_instantiate
 
-    def initialize
-      @apps = {}
-      @ruby_home = File.dirname(__FILE__)+'/../../ruby_home'
+    def initialize ruby_home = nil
+      @ruby_home =  ruby_home || File.dirname(__FILE__)+'/../../ruby_home'
       @file_handler = Rack::File.new(@ruby_home)
     end
 
+
     def call env
+      #p env
       unless @loaded
         PocketRuby.load_framework
         @loaded = true
@@ -37,33 +39,36 @@ module PocketRuby
         app_file = entry_point_file(info[:file])
 
         begin
-          changed = true
+          #changed = true
           #changed = !@apps[app_file] || (File.mtime(app_file) &gt; @apps[app_file][:last_change])
-          
-          if !@apps[app_file] || (changed &amp;&amp; ENV == 'development')
+          if !@@apps[app_file]
+            puts &quot;INIT APP #{app_file}&quot;
             Kernel.load(app_file)
-            p app_file
-            @apps[app_file] = {}
-            @apps[app_file][:app] = Magic.file_class(info[:file]).new(File.dirname(app_file))
-            @apps[app_file][:last_change] = Time.now
+            @@apps[app_file] = {}
+            app = Magic.file_class(info[:file]).new(File.dirname(app_file))
+            @@apps[app_file][:app] = app
+            if on_app_instantiate
+              @on_app_instantiate.call(app)
+            end
+            @@apps[app_file][:last_change] = Time.now
           end
         rescue
-          @apps[app_file] == nil
+          @@apps[app_file] == nil
           raise $!
         end
 
-        entry_point = @apps[app_file][:app].entry_point
+        entry_point = @@apps[app_file][:app].entry_point
         entry_point.tail = info[:tail]
         entry_point.url = info[:url][@ruby_home.split('/').length, :last]
 
 
-        $stdout = StringIO.new
+#        $stdout = StringIO.new
         point_response = entry_point.call env
         if point_response.is_a? Array
           response = Rack::Response.new(point_response[2], point_response[0], point_response[1])
         else
           response.body = point_response
-          response.body = $stdout.string + response.body
+#          response.body = $stdout.string + response.body
         end
       end
       </diff>
      <filename>pocket_ruby/fw/runner.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,14 +25,14 @@ class BelongsToTest &lt; Test::Unit::TestCase
     a = Article.new
     author = Author.new(:name =&gt; 'karel capek')
     a.author = author
-    assert_equal author, a.author.get
+    assert_equal author, a.author
   end
 
   def test_correct_value_in_form_field
     a = Article.new
     author = Author.new(:name =&gt; 'karel capek')
     a.author = author
-    assert_equal author.id, a.author.form_element.value
+    assert_equal author.id, Block.get('author', a).form_element.value
   end
 
   def test_form_field_has_correct_option_selected
@@ -46,21 +46,20 @@ class BelongsToTest &lt; Test::Unit::TestCase
   end
 
   def test_form_field_has_correct_option_selected
-    a = Article.new
+    article = Article.new
     author = Author.new(:name =&gt; 'karel capek')
     author.save
-    a.author = author
-    assert_equal(author.id, a.author.get_raw)
+    article.author = author
+    assert_equal(author.id, article.author.id)
   end
 
   def test_setting_id_makes_block_find_the_author_when_its_needed
-    a = Article.new
+    article = Article.new
     author = Author.new(:name =&gt; 'karel capek')
     author.id = 'lalalalalaaaa'
-    a.author = author.id
     author.save
-    assert_equal(author, a.author.get)
-    assert a.author == author
+    article.author = author.id
+    assert_equal(author, article.author)
   end
 end
 </diff>
      <filename>pocket_ruby/fw/ui/blocks/belongs_to_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,24 +19,58 @@ module PocketRuby
           b = block
         end
         b.name = field.to_s
-
-        klass.send(:define_method, field) {          
-          unless v = self.instance_variable_get('@'+field)
-            my_block = b.dup
-            my_block.name = field
-            my_block.object = self
-            v = self.instance_variable_set('@'+field, my_block)
-          end
-          v
-        }
-        klass.send(:define_method, field+'=') { |value|
-          self.send(field).set(value)
-        }
+        getter_setter(klass, field, b)
         Persistance.persist_field(klass, field)
       }
       @@fields[klass] = map
     end
 
+    def self.getter_setter klass, field, block
+      klass.send(:define_method, field) { |*a|
+        if !@__block || !(my_block = @__block[field])
+#          Block.init_block(field, block, self)
+          my_block = block.dup
+          my_block.name = field
+          my_block.object = self
+          @__block ||= {}
+          @__block[field] = my_block
+        end
+        v = my_block.get
+        if a.length == 1
+          self.send(field+'=', *a)
+          return self
+        else
+          return v
+        end
+      }
+      klass.send(:define_method, field+'=') { |value|
+        unless v = self.instance_variable_get('@'+field)
+#          Block.init_block(field, block, self)
+          my_block = block.dup
+          my_block.name = field
+          my_block.object = self
+          @__block ||= {}
+          @__block[field] = my_block
+        end
+        @__block[field].set(value)
+        self.instance_variable_set('@'+field, value)
+        #self.instance_variable_set('@'+field, @__block[field].get())
+      }
+    end
+
+    def self.init_block(name, block, object)
+      
+    end
+
+    def self.get name, object
+      object.send(name)
+      if blocks = object.instance_variable_get('@__block')
+        blocks[name]
+      else
+        nil
+      end
+    end
+
     def self.fields_of klass
       if klass.class != Class
         klass = klass.class
@@ -56,23 +90,29 @@ module PocketRuby
       @value
     end
 
-    def == other
-      super(other) || (get() == other)
-    end
-
-    def &lt;=&gt; other
-      if other.class.ancestors.include? Block
-        get &lt;=&gt; other.get
-      else
-        get &lt;=&gt; other
-      end
-      0
-    end
+#    def == other
+#      super(other) || (get() == other)
+#    end
+#
+#    def &lt;=&gt; other
+#      if other.class.ancestors.include? Block
+#        get &lt;=&gt; other.get
+#      else
+#        get &lt;=&gt; other
+#      end
+#      0
+#    end
 
     def get_raw
       get
     end
 
+    def create_form_element
+      e = form_element
+      e.add_primary_class self.class.to_s.split('::').last
+      e
+    end
+
     def to_s
       get.to_s
     end
@@ -105,8 +145,13 @@ module PocketRuby
   end
 
   class StringBlock &lt; Block
+    def initialize form_element_options = {}
+      @form_element_options = form_element_options
+      super()
+    end
+
     def form_element
-      InputText.new(:name =&gt; @name, :value =&gt; get)
+      InputText.new({:name =&gt; @name, :value =&gt; get}.merge(@form_element_options))
     end
 
     def template
@@ -177,12 +222,14 @@ module PocketRuby
     end
 
     def template
-      value = @to_class.find.all.select { |i| i.id == get.id }[0]
+      value = @to_class.find.by_id(get.id)
       lambda {
         if value
           add value.name
-        else
+        elsif get.id.nil?
           add '-'
+        else
+          add get.inspect
         end
       }
     end
@@ -195,18 +242,36 @@ module PocketRuby
           set hooked_object
           v = hooked_object
         else
-          raise &quot;Didn\'t find object with id #{v.inspect}.&quot;
+          raise &quot;Didn\'t find #{@to_class} with id #{v.inspect}.&quot;
+          return v
         end
       end
       v
     end
 
     def get_raw
+      v = get
+      if v == nil
+        return nil
+      end
       get.id
     end
 
+    def set value
+      if value == 'nil' || value == nil
+        super nil
+      elsif value.kind_of? @to_class
+        super
+      elsif value.kind_of?(String)
+        super
+      else
+        raise &quot;Cannot set #{value.inspect} for belongs to on #{@to_class}.&quot;
+      end
+    end
+
     def form_element
       e = Select.new(:name =&gt; @name)
+      e.add_option 'nil', ''
       @to_class.find.all.each { |i|
         e.add_option i.id, i.name
       }</diff>
      <filename>pocket_ruby/fw/ui/blocks/block.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,16 +21,13 @@ class BlockTest &lt; Test::Unit::TestCase
   def test_descriptions_generate_setters_and_getters
     author = Author.new
     author.name = 'karel capek'
-    assert_equal('karel capek', author.name.get)
+    assert_equal('karel capek', author.name)
   end
 
   def test_block_equals_compares_value_of_block_with_given_value
     author = Author.new
     author.name = 'karel capek'
-
-    # bad unit test! bad! assert_equal should do
-    # actual == expected, not the other way round
-    assert author.name == 'karel capek'
+    assert_equal author.name, 'karel capek'
   end
 
   def test_block_implements_comparator
@@ -71,8 +68,22 @@ class BlockTest &lt; Test::Unit::TestCase
         :title =&gt; Title
       })
     }
-    assert_equal 'title', c.new.title.name
+    record = c.new
+    assert_equal 'title', Block.get('title', record).name
   end
+
+  def test_chainable_setters
+    c = Class.new {
+      Block.describe(self, {
+        :title =&gt; Title
+      })
+    }
+    article = c.new
+    result = article.title(&quot;is food healthy?&quot;)
+    assert_equal article, result
+    assert_equal &quot;is food healthy?&quot;, article.title
+  end
+
 end
 
 </diff>
      <filename>pocket_ruby/fw/ui/blocks/block_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,17 @@
 module PocketRuby
   class Composite &lt; Widget
+
     def init_widget widget
       @widget = widget
-      set_class default_class
+      set_primary_classes [self.class.to_s.split('::').last]
+    end
+
+    def set_primary_classes classes
+      @widget.set_primary_classes classes
     end
 
-    def set_class class_name
-      @widget.set_class(class_name)
+    def add_primary_class class_name
+      @widget.add_primary_class(class_name)
     end
 
     def to_s</diff>
      <filename>pocket_ruby/fw/ui/element/composite.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,9 +3,9 @@ require 'cgi'
 module PocketRuby
 
   class Element
-    @@pair_tags = %w{a b div em i iframe label select span script textarea}
+    @@pair_tags = %w{a b div em i iframe label option select span script textarea}
 
-    attr_accessor :tag_name
+    attr_accessor :tag_name, :parent
 
     def initialize tag, content = nil, attrs = {}
       if attrs.keys.length == 0 &amp;&amp; (content.is_a? Hash)
@@ -31,6 +31,10 @@ module PocketRuby
 
     def append_child child
       @content &lt;&lt; child
+      if child.respond_to? :parent=
+        child.parent = self
+      end
+      child
     end
 
     def children</diff>
      <filename>pocket_ruby/fw/ui/element/element.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,99 +1,102 @@
 module PocketRuby
-  class Form &lt; Widget
+  class Form &lt; FieldComposite
     #Handler.enable self
-    attr_accessor :app, :page, :fields, :success
+    attr_accessor :app, :page, :fields, :success, :request, :env
 
     def initialize
+      super
+      self.form = self
       init_element Element.new(:form, :method =&gt; 'post')
-      @fields = []
-      #add InputHidden.new(:name =&gt; 'a', :value =&gt; Handler.name_reciever(self))
       add InputHidden.new(:name =&gt; 'a', :value =&gt; self.class.to_s)
     end
 
-    def add something
-      element.append_child something
-      something.form = self
-      @fields &lt;&lt; something
-      something
-    end
-
-    def remove something
-      element.remove_child something
-      something.form = nil
-      @fields = @fields - [something]
-      something
+    def handle data
+      if @success != nil
+        raise 'Already handled!'
+      end
+      recieve(data)
+      if valid?
+        on_success
+        @success = true
+      else
+        on_fail
+        @success = false
+      end
     end
 
-    def value(name)
-      field(name).value
+    def flash?
+      if session['flash'] &amp;&amp; (session['flash']['class'] == self.class)
+        @flash ||= session['flash']
+        session['flash'] = nil
+        return true
+      end
     end
 
-    def label name, label
-      e = Element.new(:label, :for =&gt; field(name).id)
-      e.append_child label
-      e
+    def flash_kind
+      @flash['kind']
     end
 
-    def render name
-      field(name).to_s
+    def session
+      raise &quot;No env set to #{self.class}&quot; unless env
+      env['rack.session'] ||= {}
     end
 
-    def field name
-      name = name.to_s
-      field = @fields.select { |child|
-        child.name.to_s == name
-      }[0]
-      if !field
-        names = @fields.collect { |f| f.name }
-        raise(&quot;No field '#{name}' here. Available: #{names.inspect}.&quot;)
+    def flash message = nil, kind = 'good'
+      kind += 'Flash'
+      if message == nil
+        if @flash || flash?
+          return @flash['message']
+        else
+          return nil
+        end
+      else
+        session['flash'] = {
+          'class' =&gt; self.class,
+          'message' =&gt; message,
+          'kind' =&gt; kind
+        }
       end
-      field
     end
 
-    def fill data
-      element.children.each { |child|
-        if data[child.name]
-          child.value = data[child.name]
-        end
-      }
+    def recieve data
+      super(self.class.tranform_post data)
     end
 
-    def recieve data
-      element.children.each { |child|
-        if data[child.name]
-          child.value = data[child.name]
+    def self.tranform_post post
+      transformed = {}
+      post.each { |k, v|
+        next if k == ''
+        k = k.split('[')
+        name = k.shift
+        name.tr! '][', ''
+        if k.length == 0
+          val = v
+        else
+          val = tranform_post k.join('[') =&gt; v
+        end
+        if transformed[name].kind_of? Hash
+          transformed[name] =  merge(transformed[name], val)
+        else
+          transformed[name] = val
         end
       }
+      transformed
     end
 
-    def post
-      dump
-    end
-
-    def dump
-      dump = {}
-      @fields.each { |f|
-        if f.has_value?
-          dump[f.name] = f.value
+    def self.merge a, b
+      a.merge(b) { |k, old, new|
+        if old.kind_of? Hash
+          merge(old, new)
+        else
+          new
         end
       }
-      # action won't be seen in dump
-      dump.delete('a')
-      dump
     end
 
-    def handle data
-      if @success != nil
-        raise 'Already handled!'
-      end
-      recieve(data)
-      if valid?
-        on_success
-        @success = true
-      else
-        on_fail
-        @success = false
-      end
+    def dump
+      data = super()
+      data.delete('a')
+      data
     end
 
     def valid?</diff>
      <filename>pocket_ruby/fw/ui/element/form.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,14 @@
 module PocketRuby
 
   class FormField &lt; Widget
-
     attr_accessor :form
 
     def name
-      element.name
+      @name
+    end
+
+    def name= name
+      @name = name
     end
 
     def value
@@ -31,21 +34,59 @@ module PocketRuby
     end
 
     def has_value?
-      raise &quot;Not implemented in #{selc.class}.&quot;
+      raise &quot;Not implemented in #{self.class}.&quot;
     end
 
     def link url
       form.page.link url
     end
 
-    def is_visible?
+    def visible?
       true
     end
+
+    def to_s
+      orig_name  = self.name
+
+      names = []      
+      field = self
+
+      while field!= nil
+        if field.respond_to?(:name) &amp;&amp; field.name
+          names &lt;&lt; field.name
+        end
+        field = field.parent
+      end
+
+      names.reverse!
+      if names.length &gt; 1
+        if element.tag_name != 'div'
+          element.name = names.shift + '['+names.join('][')+']'
+        end
+      end
+      r = super
+      self.name = orig_name
+      r
+    end
   end
 
   class TextArea &lt; FormField
-    def initialize content, args = {}
-      init_element Element.new('textarea', content, {}.merge(args))
+
+    def name
+      element.name
+    end
+
+    def name= name
+      element.name= name
+    end
+
+    def initialize content, args = nil
+      if args == nil
+        e = Element.new('textarea', content)
+      else
+        e = Element.new('textarea', content, args)
+      end
+      init_element e
     end
 
     def value
@@ -67,6 +108,14 @@ module PocketRuby
       init_element Element.new('select', {}.merge(args))
     end
 
+        def name
+      element.name
+    end
+
+    def name= name
+      element.name= name
+    end
+
     def add_option value, label = nil
       self.element.append_child(
         Element.new(
@@ -99,6 +148,14 @@ module PocketRuby
   end
 
   class Input &lt; FormField
+    def name
+      element.name
+    end
+
+    def name= name
+      element.name= name
+    end
+
     def initialize args = {}
       init_element Element.new('input',{ :type =&gt; 'text'}.merge(args))
     end
@@ -114,6 +171,10 @@ module PocketRuby
     def has_value?
       true
     end
+
+    def visible?
+      true
+    end
   end
 
   class InputText &lt; Input
@@ -122,12 +183,18 @@ module PocketRuby
     end
   end
 
+  class InputPassword &lt; Input
+    def initialize args = {}
+      super({:type =&gt; 'password'}.merge(args))
+    end
+  end
+
   class InputHidden &lt; Input
     def initialize args = {}
       super({:type =&gt; 'hidden'}.merge(args))
     end
 
-    def is_visible?
+    def visible?
       false
     end
   end
@@ -135,10 +202,19 @@ module PocketRuby
   class SubmitButton &lt; Input
     def initialize args = {}
       super({:type =&gt; 'submit'}.merge(args))
+      @pushed = false
     end
 
     def has_value?
-      false
+      true
+    end
+
+    def recieve v
+      @pushed = !!v
+    end
+
+    def pushed?
+      @pushed
     end
   end
   </diff>
      <filename>pocket_ruby/fw/ui/element/form_field.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,12 @@
 
 
 class FormFieldTest &lt; Test::Unit::TestCase
-
-  def test_something
+  def test_visible_by_default
+    assert FormField.new.visible?
   end
 
+  def test_has_value_raises_not_implemented
+    assert_raise(RuntimeError) {FormField.new.has_value?}
+  end
 end
 </diff>
      <filename>pocket_ruby/fw/ui/element/form_field_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -53,5 +53,41 @@ class FormTest &lt; Test::Unit::TestCase
     assert !form.fields.include?(input)
   end
 
+  def test_tranform_post_transforms_simple_nested_names
+    assert_equal(
+      {'user' =&gt; {'name' =&gt; 'michal'}},
+      Form.tranform_post('user[name]' =&gt; 'michal')
+    )
+  end
+
+  def test_tranform_post_transforms_sibling_names
+    assert_equal(
+      {'user' =&gt; {'name' =&gt; 'michal', 'login' =&gt; 'han345'}},
+      Form.tranform_post('user[name]' =&gt; 'michal', 'user[login]' =&gt; 'han345')
+    )
+  end
+
+
+  def test_tranform_post_transforms_deeply_nested_name
+    assert_equal(
+      {'user' =&gt; {'name' =&gt; { 'first' =&gt; 'michal'}}},
+      Form.tranform_post('user[name][first]' =&gt; 'michal')
+    )
+  end
+
+  def test_tranform_post_transforms_deeply_nested_siblings
+    assert_equal(
+      {'user' =&gt; {'name' =&gt; { 'first' =&gt; 'michal', 'last' =&gt; 'hantl'}}},
+      Form.tranform_post('user[name][first]' =&gt; 'michal', 'user[name][last]' =&gt; 'hantl')
+    )
+  end
+
+
+  def test_tranform_post_transforms_even_deeper_nested_siblings
+    assert_equal(
+      {'form' =&gt; {'user' =&gt; {'name' =&gt; { 'first' =&gt; 'michal', 'last' =&gt; 'hantl'}}}},
+      Form.tranform_post('form[user][name][first]' =&gt; 'michal', 'form[user][name][last]' =&gt; 'hantl')
+    )
+  end
 end
 </diff>
      <filename>pocket_ruby/fw/ui/element/form_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,16 +1,27 @@
 module PocketRuby
 
   class Widget
+    attr_accessor :element, :parent
 
-    attr_accessor :element
+    def initialize(attrs = {})
+      init_element Element.new(:div, attrs)
+    end
 
     def init_element element
+      @primary_class_names = []
       @element = element
-      set_class default_class
+      @children = []
+      add_primary_class self.class.to_s.split('::').last
+    end
+
+    def add_primary_class name
+      @primary_class_names &lt;&lt; name
+      @element.set('class', render_class_name)
     end
 
-    def set_class class_name
-      @element.set('class', class_name)
+    def set_primary_classes classes
+      @primary_class_names = classes
+      @element.set('class', render_class_name)
     end
 
     def to_s
@@ -20,13 +31,38 @@ module PocketRuby
       @element.to_s
     end
 
+    def add widget
+      element.append_child widget
+      @children &lt;&lt; widget
+      if widget.kind_of? Widget
+        widget.parent = self
+      end
+      widget
+    end
+
+    def remove child
+      element.remove child
+      @children = @children - [child]
+      child.parent = nil
+      child
+    end
+
+    def children
+      @children
+    end
+
     def id
       @element.id ||= Element.generate_id
     end
 
-    def default_class
-      self.class.to_s.split('::').last
+  private
+
+    def render_class_name
+      @primary_class_names.collect { |name|
+        name
+      }.join(' ')
     end
+
   end
 
 </diff>
      <filename>pocket_ruby/fw/ui/element/widget.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,5 +16,42 @@ class WidgetTest &lt; Test::Unit::TestCase
     w = TimePanel.new
     assert_equal '&lt;div class=&quot;TimePanel&quot;&gt;time&lt;/div&gt;', w.to_s
   end
+
+  def test_add_primary_class_name
+    w = TimePanel.new
+    w.add_primary_class 'TimePicker'
+    assert_equal '&lt;div class=&quot;TimePanel TimePicker&quot;&gt;time&lt;/div&gt;', w.to_s
+  end
+
+  def test_add_widget
+    parent = Widget.new
+    child = Widget.new
+    parent.add child
+    assert_equal [child], parent.children
+  end
+
+  def test_widget_parent_set_on_add
+    parent = Widget.new
+    child = Widget.new
+    parent.add child
+    assert_equal parent, child.parent
+  end
+
+  def test_remove_widget
+    parent = Widget.new
+    child = Widget.new
+    parent.add child
+    parent.remove child
+    assert_equal [], parent.children
+  end
+
+  def test_widget_parent_set_nil_on_remove
+    parent = Widget.new
+    child = Widget.new
+    parent.add child
+    parent.remove child
+    assert_equal nil, child.parent
+  end
+
 end
 </diff>
      <filename>pocket_ruby/fw/ui/element/widget_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,6 +33,9 @@ module PocketRuby
       mapping = StorageMapping.new()
       mapping.repository = @repository
       mapping.storage = Storage.new(@app_root+'/data', FileStorageDriver.new)
+#      records.each { |record_class|
+#        record_class.repository = @repository
+#      }
       mapping.fill_repository
     end
 
@@ -49,12 +52,28 @@ module PocketRuby
     end
 
     def class_where &amp;block
-      self.class.constants.select { |c|
-        block.call(self.class.const_get(c))
-      }.collect { |c| self.class.const_get(c) }
+      self.class.class_where(self.class, &amp;block)
+    end
+    
+    def self.class_where mod, &amp;block
+      mod.constants.select { |c|
+        value = mod.const_get(c)
+        if value.is_a? Class
+          block.call(value)
+        end
+      }.collect { |c| mod.const_get(c) }
+    end
+
+    def self.tests
+      tests = []
+      tests.push(*class_where(self) { |c| c.ancestors.include? Test::Unit::TestCase })
+      ['Test', 'Tests'].each { |namespace|
+        if self.constants.include?(namespace)
+          ns = self.const_get(namespace)
+          tests.push(*class_where(ns) { |c| c.ancestors.include? Test::Unit::TestCase })
+        end
+      }
+      tests
     end
-#    def self.inherited(subclass)
-#      puts &quot;New subclass: #{subclass}&quot;
-#    end
   end
 end
\ No newline at end of file</diff>
      <filename>pocket_ruby/fw/ui/structure/application.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,62 @@
 module PocketRuby
-  class SiteNode &lt; Page
 
+
+  # EntryPoint responds to call(env)
+  class EntryPoint
+    def call env
+      raise 'implement me!'
+    end
+  end
+
+  class ResponseException &lt; Exception
+    def initialize *a
+      @response = Rack::Response.new(*a)
+    end
+
+    def to_a
+      @response.to_a
+    end
+  end
+
+
+  class EntryNode &lt; EntryPoint
+    attr_accessor :url, :tail
+    attr_accessor :request
+    attr_accessor :params
+    attr_accessor :app, :env
+
+    def call env
+      if !env.is_a? Hash
+        raise &quot;Call expects hash with env. Got #{env.inspect}.&quot;
+      end
+      @env = env
+      @request  = Rack::Request.new env
+      @params = request.params
+      begin
+        execute
+      rescue ResponseException =&gt; r
+        return r.to_a
+      end
+    end
+
+    def execute
+      raise 'implement me!'
+    end
+
+    def redirect url, code = 303
+      respond '', code, {'location' =&gt; View.link(url, page_root)}
+    end
+
+    # set response to (body, headers, code)
+    def respond *a
+      raise ResponseException.new(*a)
+    end
+  end
+
+
+  class SiteNode &lt; EntryNode
+
+    attr_accessor :layout
     attr_accessor :view
 
     def map hash
@@ -39,55 +95,68 @@ module PocketRuby
       tail[0]
     end
 
-    def render
-      if node = subnode(action)
-        node.call(env)
+    def execute
+      if leaf = (subnode(action) || subnode('index'))
+        content = leaf.execute.to_s
       else
-        render_view
-      end      
+        content = render_view((@view || @layout).new(data))
+      end
+      if layout
+        respond render_view(layout.new({:content =&gt; content}))
+      end
+      content
     end
 
     def data
       {}
     end
 
-    def render_view
-      v = @view.new(data)
-      v.page_root = @url.join('/')
-      v.to_s
+    def render_view view
+      view.env = @env
+      view.app = @app
+      view.page_root = page_root
+      view.to_s
+    end
+
+    def page_root
+      @url.join('/')
     end
   end
 
   
+  class SiteLeaf &lt; SiteNode
+  end
 
-  class SiteRoot &lt; SiteNode
-
-    attr_accessor :layout
+  
 
-    def render
-      l = layout.new(
-        :content =&gt; content.to_s,
-        :app_name =&gt; self.class.to_s.split('::').last
-      )
-      l.app = app
-      l.page_root = url.join('/')
-      l.to_s
+  # site node that works as entry to your app
+  # also handles the post
+  class SiteRoot &lt; SiteNode
+    def initialize
+      map :dev =&gt; DevelopmentTools.new
     end
 
-    def layout
-      @layout || DefaultLayout
+    def execute
+      handle_post params
+      super
     end
 
-    def content
-      if point = subnode(action) || point = subnode('index')
-        point.render
-      else
-        '&lt;h1&gt;no content here&lt;/h1&gt;'
+    def handle_post params
+      if handler_name = params['a']
+        if handler_class = Magic.to_const(handler_name)
+          handler = handler_class.new
+          if handler.respond_to? :env=
+            handler.env = env
+          end
+          handler.handle(params)
+        else
+          raise &quot;Could not find handler #{handler_name}.&quot;
+        end
       end
     end
-
   end
 
+
   class DefaultLayout &lt; View
     def template
       lambda {
@@ -95,11 +164,12 @@ module PocketRuby
   &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;'
         html {
           head {
-            title &quot;PocketRuby application&quot;
+            title &quot;My PocketRuby application&quot;
             add '&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=UTF-8&quot;&gt;'
           }
           body {
-            h1 @app_name || 'This will be a killer app soon.'
+            h1 'This will be a killer app soon.'
+            p 'set &quot;self.layout = YourLayout&quot; in your AppRoot to change from the default one.'
             div(@content, :id =&gt; 'content')
           }
         }</diff>
      <filename>pocket_ruby/fw/ui/structure/site_structure.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 class SiteStructureTest &lt; Test::Unit::TestCase
   include PocketRuby
 
-    class SomeNode &lt; SiteNode
+    class SomeNode &lt; SiteRoot
       def initialize
         super
         map :index =&gt; TestSubNode.new
@@ -73,31 +73,41 @@ class SiteStructureTest &lt; Test::Unit::TestCase
   class PostHandler
     def handle params
       @@handled ||= 0
+      if @@handled === 1
+        raise &quot;Already handled! from call: #{@@last_called.inspect}&quot;
+      end
+      @@last_called = caller()
       @@handled += 1
     end
 
     def self.handled_times
       handled = @@handled
-      @@handled = 0
+      clear
       handled
     end
+
+    def self.clear
+      @@handled = 0
+    end
   end
 
   def test_post_is_being_processed_once
+    PostHandler.clear
     node = SomeNode.new()
     node.handle_post({'a' =&gt; PostHandler.to_s})
     assert_equal 1, PostHandler.handled_times
   end
 
   def test_post_in_nested_node_is_being_processed_once
-    node = SomeNode.new().subnode(:index)
-    node.params = {'a' =&gt; PostHandler.to_s}
-    node.view = Class.new(View) {
+    PostHandler.clear
+    root = SomeNode.new()
+    root.params = {'a' =&gt; PostHandler.to_s}
+    root.layout = Class.new(View) {
       define_method(:template) {
         lambda {}
       }
     }
-    node.execute
+    root.execute
     assert_equal 1, PostHandler.handled_times
   end
 
@@ -106,21 +116,29 @@ class SiteStructureTest &lt; Test::Unit::TestCase
      def initialize
         super
         map :index =&gt; TestSubNode.new
+        self.layout = RootLayout
         self.tail = []
         self.url = []
         self.env = {}
       end
   end
 
+   class RootLayout &lt; View; end
+
   def test_post_in_nested_node_from_root_is_being_processed_once
+    PostHandler.clear
     node = MyRoot.new()
-    node.params = {'a' =&gt; PostHandler.to_s}
+    node.params = {'a' =&gt; PostHandler.to_s }
     node.view = Class.new(View) {
       define_method(:template) {
         lambda {}
       }
     }
-    node.execute
+    begin
+      node.execute
+    rescue (ResponseException =&gt; e)
+      #its okay
+    end
     assert_equal 1, PostHandler.handled_times
   end
 </diff>
      <filename>pocket_ruby/fw/ui/structure/site_structure_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,34 +1,52 @@
 
 class View
 
-  attr_accessor :template_args, :app, :page_root
+  attr_accessor :template_args, :app, :page_root, :env
 
   def initialize(args = {})
     self.template_args = args
   end
 
   def to_s
-    t = Template.new(&amp;template)
-    t.on('a'){ |e| e.href = link e.href }
-    t.on('iframe'){ |e|
-      if e.src
-        e.src = link e.src
-      end
-    }
-    t.on('script'){ |e|
-      if e.src
-        e.src = link e.src
-      end
-    }
-    t.on('link'){ |e|
-      if e.href
-        e.href = link e.href
-      end
-    }
-    t.render(template_args)
+    begin
+      t = Template.new(&amp;template)
+      t.on('a'){ |e| e.href = link e.href }
+      t.on('iframe'){ |e|
+        if e.src
+          e.src = link e.src
+        end
+      }
+      t.on('script'){ |e|
+        if e.src
+          e.src = link e.src
+        end
+      }
+      t.on('link'){ |e|
+        if e.href
+          e.href = link e.href
+        end
+      }
+      t.render(template_args)
+    rescue
+      show_exception $!
+    end
+  end
+
+  def show_exception e
+    return '&lt;h1&gt;'+CGI.escapeHTML(e.to_s)+'&lt;/h1&gt;'+&quot;\n&quot;+e.backtrace[0..14].join(&quot;&lt;br /&gt;\n&quot;)
   end
 
   def link url
+    self.class.link url, page_root
+  end
+
+  def self.link url, page_root
+    if url.nil?
+      raise 'Cannot link nil.'
+    end
+    if page_root.nil?
+      raise 'Cannot link: no page root given.'
+    end
     File.join('/'+page_root, url)
   end
 </diff>
      <filename>pocket_ruby/fw/ui/template/view.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,9 +17,9 @@ module Loader
     #def dir(whitelist_expr, blacklist_expr)
     
     def files_under_dir dir, match = nil
-      #unless File.exist?(dir)
+      unless File.directory?(dir)
         dir = (@root + dir)
-      #end
+      end
       _seek_dir(dir, match || @match)
     end
     
@@ -28,7 +28,7 @@ module Loader
     def _seek_dir(dir, match)
       files = {}
       #puts &quot;seek #{dir}&quot;
-      Dir.new(dir).each do |filename|
+      Dir.foreach(dir) do |filename|
         next if filename[0,1] == '.'
         file = dir + '/' + filename
         if File.directory?(file)</diff>
      <filename>pocket_ruby/loader/file_seeker.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>pocket_ruby/fw/ui/structure/element_test.rb</filename>
    </removed>
    <removed>
      <filename>pocket_ruby/fw/ui/structure/entry_point.rb</filename>
    </removed>
    <removed>
      <filename>pocket_ruby/fw/ui/structure/page.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>a98b8bff457e7b2deb91ce7ac4f142c841fcade4</id>
    </parent>
  </parents>
  <author>
    <name>Michal Hantl</name>
    <email>michal.hantl@gmail.com</email>
  </author>
  <url>http://github.com/hakunin/pocket-ruby/commit/be159084087dc546d2fd6b5d43fcff10dc698583</url>
  <id>be159084087dc546d2fd6b5d43fcff10dc698583</id>
  <committed-date>2009-10-01T09:26:37-07:00</committed-date>
  <authored-date>2009-10-01T09:26:37-07:00</authored-date>
  <message>big commit</message>
  <tree>5ff34ff84d76443d325e7b6c399fdef5f251295f</tree>
  <committer>
    <name>Michal Hantl</name>
    <email>michal.hantl@gmail.com</email>
  </committer>
</commit>
