• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

system/classes/stackitem.php

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     // @todo add a hook here to register StackItem contents on demand
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         // If there was no result yet
00134         if(is_null($result)) {
00135           // If the version requested was omitted
00136           // or the version of this item is greater than or equal to the version requested
00137           if(is_null($version) || version_compare($version, $item->version) >= 0) {
00138             // return this item
00139             return $item;
00140           }
00141         }
00142         else {
00143           // If this item has a higher version than the one we already have
00144           if(version_compare($result->version, $item->version) < 0) {
00145             // return this item, which is more current
00146             return $item;
00147           }
00148         }
00149         // Otherwise, return the result we already have
00150         return $result;
00151       }, null);
00152       return $result;
00153     }
00154     return null;
00155   }
00156 }

Generated on Sun Aug 4 2013 12:51:43 for Habari by  doxygen 1.7.1