/** * Adds methods from the extensions. * Called by Object::__construct() once per class. */ function defineMethods() { if ($this->class == 'DataObject') { return; } parent::defineMethods(); // Define the extra db fields - this is only necessary for extensions added in the // class definition. Object::add_extension() will call this at definition time for // those objects, which is a better mechanism. Perhaps extensions defined inside the // class def can somehow be applied at definiton time also? if ($this->extension_instances) { foreach ($this->extension_instances as $i => $instance) { if (!$instance->class) { $class = get_class($instance); user_error("DataObject::defineMethods(): Please ensure {$class}::__construct() calls parent::__construct()", E_USER_ERROR); } DataObjectDecorator::load_extra_statics($this->class, $instance->class); } } // Set up accessors for joined items if ($manyMany = $this->many_many()) { foreach ($manyMany as $relationship => $class) { $this->addWrapperMethod($relationship, 'getManyManyComponents'); } } if ($hasMany = $this->has_many()) { foreach ($hasMany as $relationship => $class) { $this->addWrapperMethod($relationship, 'getComponents'); } } if ($hasOne = $this->has_one()) { foreach ($hasOne as $relationship => $class) { $this->addWrapperMethod($relationship, 'getComponent'); } } }
/** * Prepare static variables before processing a {@link get_static} or {@link set_static} * call. */ private static function prepare_statics($class) { // _cache_statics_prepared setting must come first to prevent infinite loops when we call // get_static below self::$_cache_statics_prepared[$class] = true; // load statics now for DataObject classes if (is_subclass_of($class, 'DataObject')) { $extensions = Object::uninherited_static($class, 'extensions'); if ($extensions) { foreach ($extensions as $extension) { DataObjectDecorator::load_extra_statics($class, $extension); } } } }
/** * Prepare static variables before processing a {@link get_static} or {@link set_static} * call. */ private static function prepare_statics($class) { // _cache_statics_prepared setting must come first to prevent infinite loops when we call // get_static below self::$_cache_statics_prepared[$class] = true; // load statics now for DataObject classes if (is_subclass_of($class, 'DataObject')) { $extensions = Object::uninherited_static($class, 'extensions'); if ($extensions) { foreach ($extensions as $extension) { $extensionClass = $extension; if (preg_match('/^([^(]*)/', $extension, $matches)) { $extensionClass = $matches[1]; } if (is_subclass_of($extensionClass, 'DataObjectDecorator')) { DataObjectDecorator::load_extra_statics($class, $extension); } else { user_error("{$extensionClass} cannot be applied to {$class} without being a DataObjectDecorator", E_USER_ERROR); } } } } }