<?php 
 
namespace frdl\Flow;
 
 
log('Starting testCase: '.__FILE__);
 
function lnbr(){
 
    echo "\n";
 
}
 
function log($str){
 
  echo microtime().':'.$str;
 
  lnbr();
 
  ob_end_flush();    
 
} 
 
function highlight_num($file)
 
{
 
  $lines = implode(range(1, count(file($file))), '<br />');
 
  $content = highlight_file($file, true);
 
 
 
 
  $out = '
 
    <style type="text/css">
 
        .num {
 
        float: left;
 
        color: gray;
 
        font-size: 13px;   
 
        font-family: monospace;
 
        text-align: right;
 
        margin-right: 6pt;
 
        padding-right: 6pt;
 
        border-right: 1px solid gray;}
 
 
        body {margin: 0px; margin-left: 5px;}
 
        td {vertical-align: top;}
 
        code {white-space: nowrap;}
 
    </style>';
 
   
 
   
 
   
 
    $out.= "<table><tr><td class=\"num\">\n$lines\n</td><td>\n$content\n</td></tr></table>";
 
     
 
    return $out;
 
} 
 
 
 
log('Creating inherited Element class and Testclasses'.lnbr().'Bind Events on Testclasses and tes-listeners'.lnbr().'Bind a TestDebugger to the "test" Event and trigger it');
 
class TestElement extends Element{
 
  protected $reflection;
 
      protected $initTime=null;
 
    public function __construct(){
 
        parent::create( func_get_args());
 
        $this->refelection = \ReflectionClass::export(get_class($this), true);
 
    }
 
    function __destruct(){
 
         register_shutdown_function(function ($className) {
 
        log('shutdown_function.invocation by destructor of '.$className);              
 
         }, get_class($this));        
 
    } 
 
   
 
   public function test($event, &$target, &$eventData){
 
         log('Triggering listener of "'.$event.'" Event in listener '.__METHOD__);
 
         log(
 
            '<pre>'
 
            .'Eventdata: '.lnbr()
 
            .print_r($eventData,true)
 
            .lnbr()
 
            .__CLASS__.':'
 
            .lnbr()
 
            .$this->refelection.lnbr()
 
            .'</pre>'.lnbr()
 
            .highlight_num(__FILE__).lnbr()
 
         );
 
   }
 
}
 
class MyElementSubClass extends Element{
 
    protected function __construct(){
 
        $args = func_get_args();
 
        parent::__construct($args);
 
        $this->name=$args[0];
 
        $this->data=$args[1];
 
        log('Creating Instance of '.__CLASS__.' inherrited from '.get_class(parent) );
 
    }
 
    public static function create($name, $data){
 
       return parent::create($name, $data);
 
    }    
 
}
 
 
function myEventListenerGlobalFunction($event, &$target, &$data) {
 
    // return false;  // cancel/ stopPropagation 
 
  log("Hello from triggered function myEventListenerGlobalFunction() on the $event Event");
 
}
 
 
class Foo {
 
  public function hello($event, &$target, &$eventData) {
 
    log("Hello from triggered ".__CLASS__."($event, ".print_r($target,true).", ".print_r($eventData,true).")");
 
  }
 
}
 
 
class Bar {
 
   public static function listen($event, &$target, &$eventData) {
 
    log("Hello from Bar::hello() dispatch ".$event);
 
  }
 
}
 
 $foo = new Foo();
 
 $Context = new \stdclass;
 
 
 
 $myElement = MyElementSubClass::create($Context)
 
  // bind a global function to the 'test' event
 
  ->on("test", "myEventListenerGlobalFunction")   
 
 
  // bind an anonymous function
 
  ->on("test", function($event, &$target, &$eventData) { 
 
     log("Hello from anonymous function triggered by Event:".$event.' with Data:'.print_r($eventData,true));
 
  })  
 
 
 
   ->on("test", "hello", $foo)  // bind an class function on an instance
 
 
 
  ->on("test", "Bar::listen")  // bind a static class function
 
 
 
 
 ;
 
$testData=array(
 
  'data' => array('someTestData', 1, 2, 3, 5, 8, 13, 21, new \stdclass),
 
  'Author' => '(c) Till Wehowski, http://frdl.webfan.de',
 
  '__FILE__' => __FILE__,
 
);
 
$myElement()
 
   ->on("test", "test", new TestElement)  
 
    
 
  // dispatch the "test event"  
 
   ->trigger("test", $testData)
 
    
 
   ;
 
 |