[ create a new paste ] login | about

Link: http://codepad.org/MjEWT67A    [ raw code | output | fork ]

PHP, pasted on Feb 9:
<?php
class EventArgs
{
    public $handled = FALSE;
}

class Event
{
    private $handlers = array();
    public function __destruct()
    {
        $this->remove_all();
    }
    public function add($handler)
    {
        if (isset($handler) && is_callable($handler))
        {
            $this->handlers[] = $handler;
        }
        return $this;
    }
    public function remove($handler)
    {
        if (isset($handler) && is_callable($handler))
        {
            $i = NULL;
            foreach ($this->handlers as $index => $f)
            {
                if ($f == $handler)
                {
                    $i = $index;
                    break;
                }
            }
            if (isset($i) && $i < count($this->handlers))
                array_splice($this->handlers, $i, 1);
        }
        return $this;
    }
    public function remove_all()
    {
        array_splice($this->handlers, 0);
        return $this;
    }
    public function trigger($sender, $args)
    {
        if(count($this->handlers) > 0)
        {
            foreach ($this->handlers as $f)
            {
                $f($sender, $args);
                if ($args->handled) break;
            }
        }
    }
}

$ev = new Event;
$sample = NULL;

echo "----------------\n";
function handler($sender, $args)
{
    echo "Handler 1\n";
}

function handler2($sender, $args)
{
    echo "Handler 2\n";
}
$ev->add(handler);
$ev->trigger($sample, new EventArgs);

echo "----------------\n";
$ev->add(handler2);
$ev->trigger($sample, new EventArgs);

echo "----------------\n";
function handler3($sender, $args)
{
    echo "New handler\n";
}
$ev->remove(handler2);
$ev->add(handler3);
$ev->trigger($sample, new EventArgs);

echo "----------------\n";
function blocking_handler($sender, $args)
{
    $args->handled = TRUE;
    echo "Last handler\n";
}
function blocked($sender, $args)
{
    echo "should not run\n";
}
$ev->add(blocking_handler);
$ev->add(blocked);
$ev->trigger($sample, new EventArgs);

echo "----------------\n";
function sole_handler($sender, $args)
{
    echo "Sole handler";
}
$ev->remove_all();
$ev->add(sole_handler);
$ev->trigger($sample, new EventArgs);
?>


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
----------------
Handler 1
----------------
Handler 1
Handler 2
----------------
Handler 1
New handler
----------------
Handler 1
New handler
Last handler
----------------
Sole handler


Create a new paste based on this one


Comments: