2015-08-17 17:00:26 -07:00
< ? php
/**
* Zend Framework ( http :// framework . zend . com / )
*
* @ link http :// github . com / zendframework / zf2 for the canonical source repository
* @ copyright Copyright ( c ) 2005 - 2015 Zend Technologies USA Inc . ( http :// www . zend . com )
* @ license http :// framework . zend . com / license / new - bsd New BSD License
*/
namespace Zend\Stdlib ;
use Traversable ;
abstract class AbstractOptions implements ParameterObjectInterface
{
/**
* We use the __ prefix to avoid collisions with properties in
* user - implementations .
*
* @ var bool
*/
protected $__strictMode__ = true ;
/**
* Constructor
*
* @ param array | Traversable | null $options
*/
public function __construct ( $options = null )
{
if ( null !== $options ) {
$this -> setFromArray ( $options );
}
}
/**
* Set one or more configuration properties
*
* @ param array | Traversable | AbstractOptions $options
* @ throws Exception\InvalidArgumentException
* @ return AbstractOptions Provides fluent interface
*/
public function setFromArray ( $options )
{
if ( $options instanceof self ) {
$options = $options -> toArray ();
}
if ( ! is_array ( $options ) && ! $options instanceof Traversable ) {
throw new Exception\InvalidArgumentException (
sprintf (
'Parameter provided to %s must be an %s, %s or %s' ,
__METHOD__ ,
'array' ,
'Traversable' ,
'Zend\Stdlib\AbstractOptions'
)
);
}
foreach ( $options as $key => $value ) {
$this -> __set ( $key , $value );
}
return $this ;
}
/**
* Cast to array
*
* @ return array
*/
public function toArray ()
{
2015-10-08 11:40:12 -07:00
$array = [];
2015-08-17 17:00:26 -07:00
$transform = function ( $letters ) {
$letter = array_shift ( $letters );
return '_' . strtolower ( $letter );
};
foreach ( $this as $key => $value ) {
if ( $key === '__strictMode__' ) {
continue ;
}
$normalizedKey = preg_replace_callback ( '/([A-Z])/' , $transform , $key );
$array [ $normalizedKey ] = $value ;
}
return $array ;
}
/**
* Set a configuration property
*
* @ see ParameterObject :: __set ()
* @ param string $key
* @ param mixed $value
* @ throws Exception\BadMethodCallException
* @ return void
*/
public function __set ( $key , $value )
{
$setter = 'set' . str_replace ( '_' , '' , $key );
2015-10-08 11:40:12 -07:00
if ( is_callable ([ $this , $setter ])) {
2015-08-17 17:00:26 -07:00
$this -> { $setter }( $value );
return ;
}
if ( $this -> __strictMode__ ) {
throw new Exception\BadMethodCallException ( sprintf (
'The option "%s" does not have a callable "%s" ("%s") setter method which must be defined' ,
$key ,
'set' . str_replace ( ' ' , '' , ucwords ( str_replace ( '_' , ' ' , $key ))),
$setter
));
}
}
/**
* Get a configuration property
*
* @ see ParameterObject :: __get ()
* @ param string $key
* @ throws Exception\BadMethodCallException
* @ return mixed
*/
public function __get ( $key )
{
$getter = 'get' . str_replace ( '_' , '' , $key );
2015-10-08 11:40:12 -07:00
if ( is_callable ([ $this , $getter ])) {
2015-08-17 17:00:26 -07:00
return $this -> { $getter }();
}
throw new Exception\BadMethodCallException ( sprintf (
'The option "%s" does not have a callable "%s" getter method which must be defined' ,
$key ,
'get' . str_replace ( ' ' , '' , ucwords ( str_replace ( '_' , ' ' , $key )))
));
}
/**
* Test if a configuration property is null
* @ see ParameterObject :: __isset ()
* @ param string $key
* @ return bool
*/
public function __isset ( $key )
{
$getter = 'get' . str_replace ( '_' , '' , $key );
return method_exists ( $this , $getter ) && null !== $this -> __get ( $key );
}
/**
* Set a configuration property to NULL
*
* @ see ParameterObject :: __unset ()
* @ param string $key
* @ throws Exception\InvalidArgumentException
* @ return void
*/
public function __unset ( $key )
{
try {
$this -> __set ( $key , null );
} catch ( Exception\BadMethodCallException $e ) {
throw new Exception\InvalidArgumentException (
'The class property $' . $key . ' cannot be unset as'
. ' NULL is an invalid value for it' ,
0 ,
$e
);
}
}
}