1<?php
2
3/**
4 * Registry object that contains information about the current context.
5 * @warning Is a bit buggy when variables are set to null: it thinks
6 *          they don't exist! So use false instead, please.
7 * @note Since the variables Context deals with may not be objects,
8 *       references are very important here! Do not remove!
9 */
10class HTMLPurifier_Context
11{
12
13    /**
14     * Private array that stores the references.
15     * @type array
16     */
17    private $_storage = array();
18
19    /**
20     * Registers a variable into the context.
21     * @param string $name String name
22     * @param mixed $ref Reference to variable to be registered
23     */
24    public function register($name, &$ref)
25    {
26        if (array_key_exists($name, $this->_storage)) {
27            trigger_error(
28                "Name $name produces collision, cannot re-register",
29                E_USER_ERROR
30            );
31            return;
32        }
33        $this->_storage[$name] =& $ref;
34    }
35
36    /**
37     * Retrieves a variable reference from the context.
38     * @param string $name String name
39     * @param bool $ignore_error Boolean whether or not to ignore error
40     * @return mixed
41     */
42    public function &get($name, $ignore_error = false)
43    {
44        if (!array_key_exists($name, $this->_storage)) {
45            if (!$ignore_error) {
46                trigger_error(
47                    "Attempted to retrieve non-existent variable $name",
48                    E_USER_ERROR
49                );
50            }
51            $var = null; // so we can return by reference
52            return $var;
53        }
54        return $this->_storage[$name];
55    }
56
57    /**
58     * Destroys a variable in the context.
59     * @param string $name String name
60     */
61    public function destroy($name)
62    {
63        if (!array_key_exists($name, $this->_storage)) {
64            trigger_error(
65                "Attempted to destroy non-existent variable $name",
66                E_USER_ERROR
67            );
68            return;
69        }
70        unset($this->_storage[$name]);
71    }
72
73    /**
74     * Checks whether or not the variable exists.
75     * @param string $name String name
76     * @return bool
77     */
78    public function exists($name)
79    {
80        return array_key_exists($name, $this->_storage);
81    }
82
83    /**
84     * Loads a series of variables from an associative array
85     * @param array $context_array Assoc array of variables to load
86     */
87    public function loadArray($context_array)
88    {
89        foreach ($context_array as $key => $discard) {
90            $this->register($key, $context_array[$key]);
91        }
92    }
93}
94
95// vim: et sw=4 sts=4
96