2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\Component\Annotation ;
use Drupal\Component\Utility\NestedArray ;
/**
* Defines a Plugin annotation object .
*
* Annotations in plugin classes can use this class in order to pass various
* metadata about the plugin through the parser to
* DiscoveryInterface :: getDefinitions () calls . This allows the metadata
* of a class to be located with the class itself , rather than in module - based
* info hooks .
*
* @ ingroup plugin_api
*
* @ Annotation
*/
class Plugin implements AnnotationInterface {
/**
* The plugin definition read from the class annotation .
*
* @ var array
*/
protected $definition ;
/**
* Constructs a Plugin object .
*
* Builds up the plugin definition and invokes the get () method for any
* classed annotations that were used .
*/
public function __construct ( $values ) {
$reflection = new \ReflectionClass ( $this );
// Only keep actual default values by ignoring NULL values.
$defaults = array_filter ( $reflection -> getDefaultProperties (), function ( $value ) {
return $value !== NULL ;
});
$parsed_values = $this -> parse ( $values );
$this -> definition = NestedArray :: mergeDeep ( $defaults , $parsed_values );
}
/**
* Parses an annotation into its definition .
*
* @ param array $values
* The annotation array .
*
* @ return array
2016-07-07 09:44:38 -07:00
* The parsed annotation as a definition .
2015-08-17 17:00:26 -07:00
*/
protected function parse ( array $values ) {
$definitions = array ();
foreach ( $values as $key => $value ) {
if ( $value instanceof AnnotationInterface ) {
$definitions [ $key ] = $value -> get ();
}
elseif ( is_array ( $value )) {
$definitions [ $key ] = $this -> parse ( $value );
}
else {
$definitions [ $key ] = $value ;
}
}
return $definitions ;
}
/**
* { @ inheritdoc }
*/
public function get () {
return $this -> definition ;
}
/**
* { @ inheritdoc }
*/
public function getProvider () {
return isset ( $this -> definition [ 'provider' ]) ? $this -> definition [ 'provider' ] : FALSE ;
}
/**
* { @ inheritdoc }
*/
public function setProvider ( $provider ) {
$this -> definition [ 'provider' ] = $provider ;
}
/**
* { @ inheritdoc }
*/
public function getId () {
return $this -> definition [ 'id' ];
}
/**
* { @ inheritdoc }
*/
public function getClass () {
return $this -> definition [ 'class' ];
}
/**
* { @ inheritdoc }
*/
public function setClass ( $class ) {
$this -> definition [ 'class' ] = $class ;
}
}