woss

Config Class

Nov 1st, 2011
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 20.31 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Woss;
  4.  
  5. /**
  6.  * @name        Config
  7.  * @package     \Woss
  8.  * @extends     \Woss\Config\Flags
  9.  * @implements  \ArrayAccess, \Coutable, \Iterator
  10.  * @uses        \Woss\Config\Exception
  11.  * @version     v1.0.0
  12.  * @since       v1.0.0
  13.  * @filesource  woss/libraries/Config.php
  14.  */
  15.  
  16. class Config extends \Woss\Config\Flags implements \ArrayAccess, \Countable, \Iterator {
  17.    
  18.     /**
  19.      * @var  array  $_config  Lista de itens de configuração
  20.      * @since  v1.0.0
  21.      */
  22.    
  23.     protected $_config = array();
  24.    
  25.     /**
  26.      * @var  integer  $_index  Índice do item atual da iteração
  27.      * @since  v1.0.0
  28.      */
  29.    
  30.     protected $_index = 0;
  31.    
  32.     /**
  33.      * @var  array  $_shortcuts  Lista de atalhos
  34.      * @since  v1.0.0
  35.      */
  36.    
  37.     protected $_shortcuts = array();
  38.  
  39.     /**
  40.      * Construtor da classe Config
  41.      *
  42.      * @param   array | Config      $config     Lista de configurações iniciais
  43.      * @param   array               $flags      Configurações pré-definidas
  44.      * @return  Config
  45.      * @access  public
  46.      * @since   v1.0.0
  47.      * @final
  48.      */
  49.    
  50.     final public function __construct($config = NULL, $flags = array()) {
  51.        
  52.         // Verifica se há configurações iniciais
  53.        
  54.         if ( $config !== NULL ) {
  55.        
  56.             // Valida as configurações iniciais
  57.            
  58.             if ( (is_array($config) && $this->_is_associative_array($config) || ($config instanceof \Woss\Config) || ($config instanceof \Woss\Config\Ini) || ($config instanceof \Woss\Config\Php)) ) {
  59.  
  60.                 // Define as configurações
  61.                
  62.                 $this->merge($config);
  63.  
  64.             } else {
  65.                
  66.                 // Dispara uma exceção de erro
  67.                
  68.                 throw new \Woss\Config\Exception ( \Woss\Config\Exception :: NOT_VALID_START_CONFIG );
  69.            
  70.             }
  71.            
  72.         }
  73.    
  74.         // Configura as flags
  75.        
  76.     parent::__construct($flags);
  77.        
  78.     }
  79.    
  80.     /**
  81.      * Retorna o valor de um item ou grupo de configuração
  82.      *
  83.      * @param   string      $name       Nome do item ou grupo de configuração
  84.      * @param   mixed       $default    Valor padrão retornado caso o item não esteja definido
  85.      * @return  mixed
  86.      * @access  public
  87.      * @since   v1.0.0
  88.      */
  89.    
  90.     public function get ($name, $default = NULL) {
  91.        
  92.         // Verifica se o item é um atalho
  93.        
  94.         if ( $this->is_shortcut($name) === TRUE ) $name = $this->_shortcuts[$name];
  95.        
  96.         // Retorna o valor do item de configuração
  97.        
  98.         return ($this->is_set($name)) ? $this->_get_item($name) : $default;
  99.        
  100.     }
  101.    
  102.     /**
  103.      * Retorna o valor de um item ou grupo de configuração
  104.      *
  105.      * @param   string      $name       Nome do item ou grupo de configuração
  106.      * @return  mixed
  107.      * @access  public
  108.      * @since   v1.0.0
  109.      */
  110.    
  111.     public function __get ($name) {
  112.        
  113.         // Retorna o valor do item de configuração
  114.        
  115.         return $this->get($name, FALSE);
  116.        
  117.     }
  118.    
  119.     /**
  120.      * Define o valor de um item de configuração
  121.      *
  122.      * @param   string      $name       Nome do item de configuração
  123.      * @param   mixed       $value      Valor do item
  124.      * @param   boolean     $overwrite  Permite o item ser sobrescrito quando este já existir
  125.      * @return  mixed
  126.      * @access  public
  127.      * @since   v1.0.0
  128.      */
  129.    
  130.     public function set ($name, $value, $overwrite = TRUE) {
  131.        
  132.         // Verifica se a lista é apenas leitura
  133.        
  134.         if ( ! $this->_is_set_flag(self::READ_ONLY) ) {
  135.            
  136.             // Verifica se o item já está definido e pode ser sobrescrito
  137.            
  138.             if ( $this->is_set($name) && !($overwrite) ) {
  139.                
  140.                 // Dispara uma exceção de erro
  141.                
  142.                 throw new \Woss\Config\Exception ( \Woss\Config\Exception :: ITEM_NOT_OVERWRITE );
  143.            
  144.             } else {
  145.                
  146.                 // Recupera a referência ao item de configuração
  147.                
  148.                 $name =& $this->_get_item($name);
  149.                
  150.                 // Define seu novo valor
  151.                
  152.                 $name = $value;
  153.                
  154.             }
  155.            
  156.         } else {
  157.            
  158.             // Dispara uma exceção de erro
  159.            
  160.             throw new \Woss\Config\Exception ( \Woss\Config\Exception :: READ_ONLY );
  161.        
  162.         }
  163.        
  164.     }
  165.    
  166.     /**
  167.      * Define o valor de um item de configuração
  168.      *
  169.      * @param   string      $name       Nome do item de configuração
  170.      * @param   mixed       $value      Valor do item
  171.      * @return  void
  172.      * @access  public
  173.      * @since   v1.0.0
  174.      */
  175.    
  176.     public function __set ($name, $value) {
  177.        
  178.         // Define o valor de um item de configuração
  179.        
  180.         $this->set($name, $value);
  181.        
  182.     }
  183.  
  184.     /**
  185.      * Verifica se determinado item está definido
  186.      *
  187.      * @param   string      $name       Nome do item de configuração
  188.      * @return  boolean
  189.      * @access  public
  190.      * @since   v1.0.0
  191.      */
  192.    
  193.     public function is_set ($name) {
  194.        
  195.         // Copia a lista de itens de configuração
  196.        
  197.         $config = $this->_config;
  198.        
  199.         // Percorre a lista
  200.        
  201.         foreach (array_map("trim", explode('.', $name)) as $group) {
  202.            
  203.             // Verifica se o grupo está definido
  204.            
  205.             if ( ! array_key_exists($group, $config) ) {
  206.                
  207.                 // Retorna falso
  208.                
  209.                 return FALSE;
  210.                
  211.             }
  212.            
  213.             // Move a lista ao sub-grupo
  214.            
  215.             $config = $config[$group];
  216.            
  217.         }
  218.        
  219.         // Retorna verdadeiro
  220.        
  221.         return TRUE;
  222.        
  223.     }
  224.    
  225.     /**
  226.      * Verifica se determinado item está definido
  227.      *
  228.      * @param   string      $name       Nome do item de configuração
  229.      * @return  boolean
  230.      * @access  public
  231.      * @since   v1.0.0
  232.      */
  233.    
  234.     public function __isset ($name) {
  235.        
  236.         // Verifica se determinado item está definido
  237.        
  238.         return $this->is_set($name);
  239.        
  240.     }
  241.  
  242.     /**
  243.      * Exclui um item de configuração
  244.      *
  245.      * @param   string      $name       Nome do item de configuração
  246.      * @return  void
  247.      * @access  public
  248.      * @since   v1.0.0
  249.      */
  250.    
  251.     public function delete ($name) {
  252.        
  253.         // Verifica se a lista é apenas leitura
  254.        
  255.         if ( ! $this->_is_set_flag(self::READ_ONLY) ) {
  256.            
  257.             // Verifica se o item possui grupos
  258.            
  259.             if ( strrpos($name, '.') !== FALSE ) {
  260.  
  261.                 // Recupera a posição inicial do nome do item
  262.                
  263.                 $index = strrpos($name, '.');
  264.  
  265.                 // Define os nomes do item e grupo
  266.                
  267.                 $item  = substr($name, $index+1);
  268.                 $group = substr($name, 0, $index);
  269.                
  270.                 // Recupera a referência ao grupo
  271.                
  272.                 $group =& $this->_get_item($group);
  273.                
  274.                 // Exclui o item da lista
  275.  
  276.                 unset ($group[$item]);
  277.  
  278.             } else {
  279.  
  280.                 // Exclui o item da lista
  281.                
  282.                 unset ($this->_config[$name]);
  283.  
  284.             }
  285.            
  286.         } else {
  287.            
  288.             // Dispara uma exceção de erro
  289.            
  290.             throw new \Woss\Config\Exception ( \Woss\Config\Exception :: READ_ONLY );
  291.        
  292.          }
  293.        
  294.     }
  295.    
  296.     /**
  297.      * Exclui um item de configuração
  298.      *
  299.      * @param   string      $name       Nome do item de configuração
  300.      * @return  void
  301.      * @access  public
  302.      * @since   v1.0.0
  303.      */
  304.    
  305.     public function __unset ($name) {
  306.        
  307.         // Exclui um item da lista
  308.        
  309.         $this->delete($name);
  310.        
  311.     }
  312.    
  313.     /**
  314.      * Limpa a lista de itens de configuração
  315.      *
  316.      * @return  void
  317.      * @access  public
  318.      * @since   v1.0.0
  319.      */
  320.    
  321.     public function clear () {
  322.        
  323.         // Verifica se a lista é apenas leitura
  324.        
  325.         if ( ! $this->_is_set_flag(self::READ_ONLY) ) {
  326.            
  327.             // Limpa a lista completa
  328.            
  329.             $this->_config = array();
  330.             $this->_index = 0;
  331.            
  332.         } else {
  333.            
  334.             // Dispara uma exceção de erro
  335.            
  336.             throw new \Woss\Config\Exception ( \Woss\Config\Exception :: READ_ONLY );
  337.        
  338.         }
  339.        
  340.     }
  341.  
  342.     /**
  343.      * Retorna a quantidade de itens definidos
  344.      *
  345.      * @return  integer
  346.      * @access  public
  347.      * @since   v1.0.0
  348.      */
  349.    
  350.     public function count () {
  351.        
  352.         // Retorna a quantidade de itens definidos em primeiro nível
  353.        
  354.         return count($this->_config);
  355.        
  356.     }
  357.  
  358.     /**
  359.      * Mescla várias listas de configuração
  360.      *
  361.      * @param   array | Config | Ini | Php      Lista de configuração a ser mesclada
  362.      * @return  void
  363.      * @access  public
  364.      * @since   v1.0.0
  365.      */
  366.    
  367.     public function merge () {
  368.        
  369.         // Verifica se a lista é apenas leitura
  370.        
  371.         if ( ! $this->_is_set_flag(self::READ_ONLY) ) {
  372.            
  373.             // Recupera a lista de listas de configuração
  374.            
  375.             $lists = func_get_args();
  376.            
  377.             // Percorre a lista de listas
  378.  
  379.             foreach ($lists as $list) {
  380.  
  381.                 // Verifica se a lista é válida
  382.                
  383.                 if ( (is_array($list) && $this->_is_associative_array($list) || ($list instanceof \Woss\Config) || ($list instanceof \Woss\Config\Ini) || ($list instanceof \Woss\Config\Php)) ) {
  384.  
  385.                     // Verifica se a lista é instância de Config
  386.                    
  387.                     if ( $list instanceof Config ) {
  388.  
  389.                         // Mescla as configurações com as novas
  390.                        
  391.                         $this->_config = array_merge($this->_config, $list->return_as_array());
  392.  
  393.                     } else if ( is_array($list) ) {
  394.  
  395.                         // Percorre a lista
  396.                        
  397.                         foreach ($list as $name => $value) {
  398.  
  399.                             // Define os itens de configuração
  400.                            
  401.                             $this->set($name, $value);
  402.  
  403.                         }
  404.  
  405.                     } else {
  406.                        
  407.                         // Mescla as configurações com as novas
  408.                        
  409.                         $this->_config = array_merge($this->_config, $list->as_array());
  410.                        
  411.                     }
  412.  
  413.                 } else {
  414.  
  415.                     // Dispara uma exceção de erro
  416.                    
  417.                     throw new \Woss\Config\Exception ( \Woss\Config\Exception :: MESCLE_FAIL );
  418.  
  419.                 }
  420.  
  421.             }
  422.            
  423.         } else {
  424.            
  425.             // Dispara uma exceção de erro
  426.            
  427.             throw new \Woss\Config\Exception ( \Woss\Config\Exception :: READ_ONLY );
  428.        
  429.         }
  430.        
  431.     }
  432.    
  433.     /**
  434.      * Mescla uma lista de configuração armazendando em um grupo
  435.      *
  436.      * @param   array | Config      $list       Lista de configuração a ser mesclada
  437.      * @param   string              $group      Nome do grupo
  438.      * @return  void
  439.      * @access  public
  440.      * @since   v1.0.0
  441.      */
  442.    
  443.     public function merge_as_group ($list, $group) {
  444.        
  445.         // Verifica se a lista é apenas leitura
  446.        
  447.         if ( ! $this->_is_set_flag(self::READ_ONLY) ) {
  448.            
  449.             // Verifica se a lista é válida
  450.            
  451.             if ( (is_array($list) && $this->_is_associative_array($list) || ($list instanceof \Woss\Config) || ($list instanceof \Woss\Config\Ini) || ($list instanceof \Woss\Config\Php)) ) {
  452.  
  453.                 // Verifica se o item já está definido
  454.                
  455.                 if ( ! $this->is_set($group) ) $this->set($group, array());
  456.                
  457.                 // Recupera a referência ao item
  458.                
  459.                 $item =& $this->_get_item($group);
  460.                
  461.                 // Verifica se é instância de Config
  462.                
  463.                 if ( $list instanceof Config ) {
  464.  
  465.                     // Mescla as configurações com as novas
  466.                    
  467.                     $item = array_merge($item, $list->return_as_array());
  468.  
  469.                 } else {
  470.  
  471.                     // Mescla as configurações com as novas
  472.                    
  473.                     $item = array_merge($item, $list);
  474.  
  475.                 }
  476.  
  477.             } else {
  478.  
  479.                 // Dispara uma exceção de erro
  480.                
  481.                 throw new \Woss\Config\Exception ( \Woss\Config\Exception :: MESCLE_FAIL );
  482.  
  483.             }
  484.            
  485.         } else {
  486.            
  487.             // Dispara uma exceção de erro
  488.            
  489.             throw new \Woss\Config\Exception ( \Woss\Config\Exception :: READ_ONLY );
  490.        
  491.         }
  492.        
  493.     }
  494.    
  495.     /**
  496.      * Copia um item ou grupo de configuração para outro
  497.      *
  498.      * @param   string      $source         Nome do item ou grupo de configuração de origem
  499.      * @param   string      $destination    Nome do item ou grupo de configuração de destino
  500.      * @return  void
  501.      * @access  public
  502.      * @since   v1.0.0
  503.      */
  504.    
  505.     public function copy ($source, $destination) {
  506.        
  507.         // Copia o valor de um item em outro
  508.        
  509.         $this->set($destination, $this->get($source));
  510.        
  511.     }
  512.    
  513.     /**
  514.      * Cria um atalho para ou item ou grupo de configuração
  515.      *
  516.      * @param   string      $name       Nome do item ou grupo de configuração
  517.      * @param   string      $shortcut   Nome do atalho
  518.      * @return  void
  519.      * @access  public
  520.      * @since   v1.0.0
  521.      */
  522.    
  523.     public function shortcut ($name, $shortcut) {
  524.        
  525.         // Cria um atalho na lista
  526.        
  527.         $this->_shortcuts[$shortcut] = $name;
  528.        
  529.     }
  530.    
  531.     /**
  532.      * Verifica se determinada string é atalho para um item ou grupo de configuração
  533.      *
  534.      * @param   string      $shortcut   Nome do atalho a ser validado
  535.      * @return  boolean
  536.      * @access  public
  537.      * @access  v1.0.0
  538.      */
  539.    
  540.     public function is_shortcut ($shortcut) {
  541.        
  542.         // Verifica se determinado atalho está definido
  543.        
  544.         return array_key_exists($shortcut, $this->_shortcuts);
  545.        
  546.     }
  547.  
  548.     /**
  549.      * Retorna a lista de itens de configuração em forma de array
  550.      *
  551.      * @return  array
  552.      * @access  public
  553.      * @since   v1.0.0
  554.      */
  555.    
  556.     public function as_array () {
  557.        
  558.         // Retorna a lista de itens de configuração
  559.        
  560.         return $this->_config;
  561.        
  562.     }
  563.    
  564.     /**
  565.      * Retorna o item de iteração atual
  566.      *
  567.      * @return  mixed
  568.      * @access  public
  569.      * @since   v1.0.0
  570.      */
  571.    
  572.     public function current () {
  573.        
  574.         // Retorna o item corrente
  575.        
  576.         return current($this->_config);
  577.        
  578.     }
  579.    
  580.     /**
  581.      * Retorna o índice do item de iteração atual
  582.      *
  583.      * @return  integer
  584.      * @access  public
  585.      * @since   v1.0.0
  586.      */
  587.    
  588.     public function key () {
  589.        
  590.         // Retorna a chave do índice corrente
  591.        
  592.         return key($this->_config);
  593.        
  594.     }
  595.    
  596.     /**
  597.      * Move o ponteiro de iteração ao próximo elemento
  598.      *
  599.      * @return  void
  600.      * @access  public
  601.      * @since   v1.0.0
  602.      */
  603.    
  604.     public function next () {
  605.        
  606.         // Move o ponteiro ao próximo item
  607.        
  608.         next($this->_config);
  609.         ++$this->_index;
  610.        
  611.     }
  612.    
  613.     /**
  614.      * Move o ponteiro de iteração ao início da lista
  615.      *
  616.      * @return  void
  617.      * @access  public
  618.      * @since   v1.0.0
  619.      */
  620.    
  621.     public function rewind () {
  622.        
  623.         // Reinicia a iteração, movendo o ponteiro ao início da lista
  624.        
  625.         reset($this->_config);
  626.         $this->_index = 0;
  627.        
  628.     }
  629.    
  630.     /**
  631.      * Verifica se há mais itens durante a iteração
  632.      *
  633.      * @return  boolean
  634.      * @access  public
  635.      * @since   v1.0.0
  636.      */
  637.    
  638.     public function valid () {
  639.        
  640.         // Verifica se há mais itens na iteração
  641.        
  642.         return ($this->_index < count($this->_config));
  643.        
  644.     }
  645.    
  646.     /**
  647.      * Verifica se determinado item de configuração está definido
  648.      *
  649.      * @param   string      $name       Nome do item de configuração
  650.      * @return  boolean
  651.      * @access  public
  652.      * @since   v1.0.0
  653.      */
  654.    
  655.     public function offsetExists ($name) {
  656.        
  657.         // Verifica se determinado item está definido
  658.        
  659.         return $this->is_set($name);
  660.        
  661.     }
  662.    
  663.     /**
  664.      * Retorna o valor de um item de configuração
  665.      *
  666.      * @param   string      $name       Nome do item de configuração
  667.      * @return  mixed
  668.      * @access  public
  669.      * @since   v1.0.0
  670.      */
  671.    
  672.     public function offsetGet ($name) {
  673.        
  674.         // Retorna o valor de um item de configuração
  675.        
  676.         return $this->get($name, FALSE);
  677.        
  678.     }
  679.    
  680.     /**
  681.      * Define o valor de um item de configuração
  682.      *
  683.      * @param   string      $name       Nome do item de configuração
  684.      * @param   mixed       $value      Valor do item
  685.      * @return  void
  686.      * @access  public
  687.      * @since   v1.0.0
  688.      */
  689.    
  690.     public function offsetSet ($name, $value) {
  691.        
  692.         // Define o valor de um item de configuração
  693.        
  694.         $this->set($name, $value);
  695.        
  696.     }
  697.    
  698.     /**
  699.      * Exclui um item de configuração
  700.      *
  701.      * @param   string      $name       Nome do item de configuração
  702.      * @return  void
  703.      * @access  public
  704.      * @since   v1.0.0
  705.      */
  706.    
  707.     public function offsetUnset ($name) {
  708.        
  709.         // Exclui um item de configuração
  710.        
  711.         $this->delete($name);
  712.        
  713.     }
  714.    
  715.     /**
  716.      * Retorna a referência a um item de configuração. Se o item não existir, este é, então, criado
  717.      *
  718.      * @param   string      $name       Nome do item de configuração
  719.      * @return  mixed
  720.      * @access  protected
  721.      * @since   v1.0.0
  722.      * @final
  723.      */
  724.    
  725.     final protected function & _get_item ($name) {
  726.        
  727.         // Recupera a referência ao início da lista de itens
  728.        
  729.         $config =& $this->_config;
  730.        
  731.         // Percorre os grupos do item
  732.        
  733.         foreach (array_map("trim", explode('.', $name)) as $group) {
  734.            
  735.             // Verifica se o grupo está definido
  736.            
  737.             if ( ! array_key_exists($group, $config) ) $config[$group] = array();
  738.            
  739.             // Move a lista ao sub-grupo
  740.            
  741.             $config =& $config[$group];
  742.            
  743.         }
  744.        
  745.         // Returna a referência ao item
  746.        
  747.         return $config;
  748.        
  749.     }
  750.    
  751.     /**
  752.      * Verifica se uma array é da forma associativa
  753.      *
  754.      * @param   array       $array      Array a ser validada
  755.      * @return  boolean
  756.      * @access  protected
  757.      * @since   v1.0.0
  758.      * @final
  759.      */
  760.    
  761.     final protected function _is_associative_array (array $array) {
  762.        
  763.         // Percorre a array
  764.        
  765.         foreach ($array as $key => $value) {
  766.            
  767.             // Verifica se a chave corrente é do tipo inteiro
  768.            
  769.             if ( is_integer($key) ) {
  770.                
  771.                 // Retorna falso
  772.                
  773.                 return FALSE;
  774.                
  775.             }
  776.            
  777.         }
  778.        
  779.         // Retorna verdadeiro
  780.        
  781.         return TRUE;
  782.        
  783.     }
  784.    
  785. }
  786.  
  787.  
Advertisement
Add Comment
Please, Sign In to add comment