<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/extensions/kernel.rb</filename>
    </added>
    <added>
      <filename>lib/player/joint.rb</filename>
    </added>
    <added>
      <filename>lib/player/joint/angles.yml</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -12,10 +12,13 @@ module Client
   
   def connect
     @thread = Thread.new do
-      Client::Socket.open Server do |socket|
+      Socket.open Server do |socket|
         loop do
-          socket.puts Player.commands.shift unless Player.commands.empty?
-          Player.data = Client::Mapper.new Client::Parser.run socket.gets
+          unless Player.commands.empty?            
+            socket.puts Player.commands.join(&quot;\n&quot;)
+            Player.commands.clear
+          end
+          Player.data = Mapper.new Parser.run socket.gets
         end
       end
     end</diff>
      <filename>lib/client.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,7 @@
+require 'extensions/kernel'
+
 require 'player/observable'
-require 'player/joints'
+require 'player/joint'
 require 'player/pose'
 require 'player/movement'
 
@@ -7,6 +9,6 @@ module Player
   extend self
   
   attr_reader :commands, :data
+  @data     = {}  
   @commands = []
-  @data = {}  
 end
\ No newline at end of file</diff>
      <filename>lib/player.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,26 +1,41 @@
 module Player
+  # TODO: think about reimplementing
   
-  def data=(new_data)    
-    notify :new_cycle, new_data
+  def data=(new_data)
+    notify :before_every_cycle, new_data
+    old_data = data.clone
     data.merge!(new_data) do |perceptor, old_value, new_value|
       notify(perceptor, old_value, new_value) unless old_value == new_value
       new_value
     end
+    notify :after_every_cycle, old_data
   end
   
   @observers = Hash.new {|hash, new_perceptor| hash[new_perceptor] = {} }
   @callbacks = Hash.new {|hash, new_perceptor| hash[new_perceptor] = [] }
 
-  def every_cycle(&amp;callback)
-    @callbacks[:new_cycle] &lt;&lt; callback
+  def after_every_cycle(name=nil, &amp;callback)
+    if name
+      @observers[:after_every_cycle][name] = callback
+    else
+      @callbacks[:after_every_cycle] &lt;&lt; callback
+    end
   end
 
-  def add_callback(perceptor, &amp;observer)
-    @callbacks[perceptor] &lt;&lt; observer
+  def before_every_cycle(name=nil, &amp;callback)
+    if name
+      @observers[:before_every_cycle][name] = callback
+    else
+      @callbacks[:before_every_cycle] &lt;&lt; callback
+    end
+  end
+  
+  def add_callback(perceptor, &amp;callback)
+    @callbacks[perceptor] &lt;&lt; callback
   end
 
-  def add_observer(perceptor, name, &amp;observer)
-    @observers[perceptor][name] = observer
+  def add_observer(perceptor, name, &amp;callback)
+    @observers[perceptor][name] = callback
   end
 
   def remove_observer(perceptor, name)</diff>
      <filename>lib/player/observable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 
-# TODO: move to the vendor
+# TODO: move external dependencies like rawline to the vendor folder
 require 'rubygems'
 # TODO: print suggestion to install gem termios to make raw_console faster on *nix
 require 'rawline'
@@ -29,7 +29,8 @@ editor.bind(:ctrl_a) do
   editor.write_line &quot;Completion info:\n #{editor.completion_proc.call(word).join ' '}&quot;
 end
 
-editor.completion_proc = proc {|word| Player.effectors.values.select {|it| it.include? word }}
+# TODO: fix to get a list of effectors from the right place
+# editor.completion_proc = proc {|word| Player.effectors.values.select {|it| it.include? word }}
 editor.completion_append_string = ' '
 
 Client::Socket.open SERVER do |socket|</diff>
      <filename>script/raw_console</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>lib/extensions/loader.rb</filename>
    </removed>
    <removed>
      <filename>lib/player/joints.rb</filename>
    </removed>
    <removed>
      <filename>lib/player/joints/angles.yml</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>260216612e41e71e33037191098eaf646182b95a</id>
    </parent>
  </parents>
  <author>
    <name>brainopia</name>
    <email>ravwar@gmail.com</email>
  </author>
  <url>http://github.com/brainopia/robocup-client/commit/c04724c4eb3efcef6dde51f668eb4bd3606e761f</url>
  <id>c04724c4eb3efcef6dde51f668eb4bd3606e761f</id>
  <committed-date>2009-05-16T08:28:09-07:00</committed-date>
  <authored-date>2009-05-16T08:28:09-07:00</authored-date>
  <message>Completely revamp joint system</message>
  <tree>89e7f83aa9b3db314ea888cc661f66a45a85501c</tree>
  <committer>
    <name>brainopia</name>
    <email>ravwar@gmail.com</email>
  </committer>
</commit>
