final protected function raw_get($property) {
        if (!static::has_property($property)) {
            throw new coding_exception('Unexpected property \'' . s($property) .'\' requested.');
        }
        if (!array_key_exists($property, $this->data) && !static::is_property_required($property)) {
            $this->raw_set($property, static::get_property_default_value($property));
        }
        return isset($this->data[$property]) ? $this->data[$property] : null;
    }