00001 <?php
00007 namespace Habari;
00015 class StackItem
00016 {
00017 static $items = array();
00018 public $dependencies = array();
00019 public $resource = '';
00020
00027 public function __construct($name, $version, $resource)
00028 {
00029 $this->name = $name;
00030 $this->version = $version;
00031 $this->resource = $resource;
00032 }
00033
00038 public function __toString()
00039 {
00040 if(is_callable($this->resource)) {
00042 $fn = $this->resource;
00043 return $fn($this);
00044 }
00045 return $this->resource;
00046 }
00047
00048 public function __get($name)
00049 {
00050 switch($name) {
00051 case 'resource':
00052 return Plugins::filter('get_stackitem_resource', $this->resource, $this);
00053 }
00054 trigger_error(_t('Requested property @name does not exist.', array('@name' => $name)), E_NOTICE);
00055 return null;
00056 }
00057
00064 public function add_dependency($itemname, $version = null)
00065 {
00066 if($itemname instanceof StackItem) {
00067 $this->dependencies[] = $itemname;
00068 }
00069 else {
00070 $this->dependencies[] = array('name' => $itemname, 'version' => $version);
00071 }
00072 return $this;
00073 }
00074
00079 public function get_dependencies()
00080 {
00081 $results = array();
00082 foreach($this->dependencies as $dependency) {
00083 if(is_array($dependency)) {
00084 $stackitem = self::get($dependency['name'], $dependency['version']);
00085 if($stackitem instanceof StackItem) {
00086 $results[$dependency['name']] = $stackitem;
00087 }
00088 }
00089 else {
00090 $results[$dependency->name] = $dependency;
00091 }
00092 }
00093 return array_filter($results);
00094 }
00095
00101 public function in_stack_index($stack)
00102 {
00103 return isset($stack[$this->name]);
00104 }
00105
00112 public static function register($name, $resource = '', $version = 0) {
00113
00114 $item = new StackItem($name, $version, $resource);
00115 if(!isset(self::$items[$name])) {
00116 self::$items[$name] = array();
00117 }
00118 self::$items[$name][$version] = $item;
00119 uksort(self::$items[$name], function($a, $b) {
00120 return version_compare($a, $b);
00121 });
00122 return $item;
00123 }
00124
00130 public static function get($name, $version = null) {
00131 if(isset(self::$items[$name])) {
00132 $result = array_reduce(self::$items[$name], function(&$result, $item) use ($version) {
00133
00134 if(is_null($result)) {
00135
00136
00137 if(is_null($version) || version_compare($version, $item->version) >= 0) {
00138
00139 return $item;
00140 }
00141 }
00142 else {
00143
00144 if(version_compare($result->version, $item->version) < 0) {
00145
00146 return $item;
00147 }
00148 }
00149
00150 return $result;
00151 }, null);
00152 return $result;
00153 }
00154 return null;
00155 }
00156 }