with (classes) {
//
with (Common) {
//
Common.Observable = function ()
{
 if (this.Observable) return this; this.Observable = Observable;

 this.The_Observers = null;

 with (Observable)
 {
  this.addObserver = addObserver;
  this.removeObserver = removeObserver;
  this.broadcast = broadcast;
  this.broadcastAsync = broadcastAsync;

  with (this)
  {
   if (! The_Observers) The_Observers = new Array; // handle multiple (non-virtual) inheritance
  }
 }

 return this;
}
//
Observable.addObserver = function (This_Observer) { with (this)
{
 var ThisObserver_index = 0,
     Observer_count = The_Observers.length;

 while (! (ThisObserver_index == Observer_count || The_Observers[ThisObserver_index] == This_Observer))
  ++ ThisObserver_index;

 if (ThisObserver_index == Observer_count) The_Observers.push(This_Observer);
}}
//
Observable.removeObserver = function (This_Observer) { with (this)
{
 var ThisObserver_index = 0,
     Observer_count = The_Observers.length;

 while (ThisObserver_index != Observer_count && The_Observers[ThisObserver_index] != This_Observer)
  ++ ThisObserver_index;

 if (ThisObserver_index != Observer_count) The_Observers.splice(ThisObserver_index, 1);
}}
//
Observable.broadcast = function () { with (this)
{
 var method_name = arguments[0],
     argument_count = arguments.length - 1;

 for (var argument_index = 0; argument_index != argument_count; ++ argument_index)
  arguments[argument_index] = arguments[argument_index + 1];

 arguments[argument_count] = this;

 var Current_Observers = The_Observers.concat(),
     This_Observer;

 while (This_Observer = Current_Observers.shift())
 {
  var The_Function = This_Observer[method_name];

  if (The_Function && The_Function != arguments.caller) The_Function.apply(This_Observer, arguments);
 }
}}
//
Observable.broadcastAsync = function () { with (this)
{
 var This = this, Arguments = arguments;

 setTimeout(function () { Observable.broadcast.apply(This, Arguments); }, 0);
}}
//
}
//
}
