| <?php |
| /** |
| * File containing the ezcConsoleArguments collection class. |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| * @package ConsoleTools |
| * @version //autogentag// |
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 |
| * @filesource |
| */ |
| |
| /** |
| * Collection class for ezcConsoleArgument objects. Used in {@link ezcConsoleInput}. |
| * |
| * @package ConsoleTools |
| * @version //autogen// |
| */ |
| class ezcConsoleArguments implements ArrayAccess, Iterator, Countable |
| { |
| /** |
| * Ordered list of arguments. |
| * |
| * @var array(ezcConsoleArgument) |
| */ |
| protected $ordered = array(); |
| |
| /** |
| * Named list of arguments. |
| * |
| * @var array(string=>ezcConsoleArgument) |
| */ |
| protected $named = array(); |
| |
| /** |
| * Returns if the given offset exists. |
| * This method is part of the ArrayAccess interface to allow access to the |
| * data of this object as if it was an array. Valid offsets are integers or |
| * strings. If an integer is used, it refers to the position in the command |
| * line. A string refers to the arguments name property. |
| * |
| * @param mixed $offset The offset to check. |
| * @return bool True when the offset exists, otherwise false. |
| * |
| * @throws ezcBaseValueException |
| * If the provided offset is neither an integer, nor a string. |
| */ |
| public function offsetExists( $offset ) |
| { |
| switch ( gettype( $offset ) ) |
| { |
| case "string": |
| return array_key_exists( $offset, $this->named ); |
| case "integer": |
| return array_key_exists( $offset, $this->ordered ); |
| default: |
| throw new ezcBaseValueException( "offset", $offset, "string or int" ); |
| } |
| } |
| |
| /** |
| * Returns the element with the given offset. |
| * This method is part of the ArrayAccess interface to allow access to the |
| * data of this object as if it was an array. Valid offsets are integers or |
| * strings. If an integer is used, it refers to the position in the command |
| * line. A string refers to the arguments name property. |
| * |
| * @param string|integer $offset The offset to check. |
| * @return ezcConsoleArgument |
| * |
| * @throws ezcBaseValueException |
| * If the provided offset is neither an integer, nor a string. |
| */ |
| public function offsetGet( $offset ) |
| { |
| switch ( gettype( $offset ) ) |
| { |
| case "string": |
| if ( isset( $this[$offset] ) ) |
| { |
| return $this->named[$offset]; |
| } |
| break; |
| case "integer": |
| if ( isset( $this[$offset] ) ) |
| { |
| return $this->ordered[$offset]; |
| } |
| break; |
| default: |
| throw new ezcBaseValueException( "offset", $offset, "string or int" ); |
| } |
| throw new ezcBasePropertyNotFoundException( $offset ); |
| } |
| |
| /** |
| * Set the element with the given offset. |
| * This method is part of the ArrayAccess interface to allow access to the |
| * data of this object as if it was an array. In contrast to the other |
| * ArrayAccess implementations of this class, this method allows only integer |
| * keys. |
| * |
| * @param int $offset The offset to assign an item to. |
| * @param ezcConsoleArgument $value The argument object to register. |
| * @return void |
| * |
| * @throws ezcBaseValueException |
| * If a non integer offset is provided. |
| * @throws ezcBaseValueException |
| * If the provided value is not of type {@ling ezcConsoleTableRow}. |
| * @throws ezcConsoleArgumentAlreadyRegisteredException |
| * If an argument with the given offset or name is already registered. |
| */ |
| public function offsetSet( $offset, $value ) |
| { |
| // Determine key if not set (using $obj[] = ...) |
| if ( $offset === null ) |
| { |
| $offset = count( $this->ordered ) === 0 ? 0 : max( array_keys( $this->ordered ) ) + 1; |
| } |
| |
| // Set access only allowed with integer values |
| if ( !is_int( $offset ) ) |
| { |
| throw new ezcBaseValueException( "offset", $offset, "int" ); |
| } |
| |
| switch ( true ) |
| { |
| case ( $value instanceof ezcConsoleArgument ): |
| if ( isset( $this->ordered[$offset] ) ) |
| { |
| throw new ezcConsoleArgumentAlreadyRegisteredException( $offset, ezcConsoleArgumentAlreadyRegisteredException::ORDERED ); |
| } |
| if ( isset( $this->named[$value->name] ) ) |
| { |
| throw new ezcConsoleArgumentAlreadyRegisteredException( $value->name, ezcConsoleArgumentAlreadyRegisteredException::NAMED ); |
| } |
| |
| $this->named[$value->name] = $value; |
| $this->ordered[$offset] = $value; |
| break; |
| case ( $value === null ): |
| // Aliasing unset() with assignement to null |
| unset( $this->named[$this->ordered[$offset]->name] ); |
| unset( $this->ordered[$offset] ); |
| break; |
| default: |
| throw new ezcBaseValueException( "value", $value, "ezcConsoleArgument or null" ); |
| } |
| } |
| |
| /** |
| * Unset the element with the given offset. |
| * This method is part of the ArrayAccess interface to allow access to the |
| * data of this object as if it was an array. In contrast to the other |
| * ArrayAccess implementations of this class, this method allows only integer |
| * keys. |
| * |
| * @param int $offset The offset to unset the value for. |
| * @return void |
| * |
| * @throws ezcBaseValueException |
| * If a non numeric row offset is used. |
| */ |
| public function offsetUnset( $offset ) |
| { |
| // Set access only allowed with integer values |
| if ( is_int( $offset ) === false ) |
| { |
| throw new ezcBaseValueException( "offset", $offset, "int" ); |
| } |
| |
| unset( $this->named[$this->ordered[$offset]->name] ); |
| unset( $this->ordered[$offset] ); |
| } |
| |
| /** |
| * Returns the currently selected argument from the list. |
| * Used by foreach-Loops. |
| * |
| * @return ezcConsoleArgument |
| */ |
| public function current() |
| { |
| return current( $this->ordered ); |
| } |
| |
| /** |
| * Returns the key of the currently selected argument from the list. |
| * Used by foreach-Loops. In contrast to the iteration direction, which is |
| * defined by the ordered list of arguments, this is the name of the |
| * argument. |
| * |
| * @return string |
| */ |
| public function key() |
| { |
| return key( $this->ordered ); |
| } |
| |
| /** |
| * Advances the internal pointer to the next argument and returns it. |
| * Used by foreach-Loops. |
| * |
| * @return ezcConsoleArgument |
| */ |
| public function next() |
| { |
| return next( $this->ordered ); |
| } |
| |
| /** |
| * Rewinds the internal pointer to the first argument and returns it. |
| * Used by foreach-Loops. |
| * |
| * @return ezcConsoleArgument |
| */ |
| public function rewind() |
| { |
| // Called before foreach |
| ksort( $this->ordered ); |
| return reset( $this->ordered ); |
| } |
| |
| /** |
| * Checks if the current position is valid. |
| * Used by foreach-Loops. |
| * |
| * @return bool |
| */ |
| public function valid() |
| { |
| return ( current( $this->ordered ) !== false ); |
| } |
| |
| /** |
| * Returns the number of registered arguments. |
| * |
| * @return int |
| */ |
| public function count() |
| { |
| return count( $this->ordered ); |
| } |
| } |
| ?> |