<?php
require_once 'AnnotationParser.class.php';
abstract class DocAnnotation {
private static $cache = array();
/**
*
* @param $string
* @return unknown_type
*/
public static function getAnnotationsFromString($string) {
$p = new AnnotationParser();
$p->parse($string);
return $p->annotations;
}
private static function extractSections($string) {
$found = array();
while (preg_match('/<!---([[:print:][:space:]]*?)-->/', $string, $matches)) {
$found[] = $matches[1];
$string = substr($string, strpos($string, $matches[0]) + strlen($matches[0]));
}
return (count($found) == 0) ? $string : implode(" ", $found);
}
/**
*
* @param $obj
* @param $prop
* @return unknown_type
*/
public static function getPropertyAnnotations($obj, $prop) {
if (trim($prop) == '')
throw new InvalidArgumentException('Property name must not be empty.');
$key = 'prop_'.get_class($obj).'_'.$prop;
if (!isset(self::$cache[$key])) {
$refl = new ReflectionProperty($obj, $prop);
self::$cache[$key] = self::getAnnotationsFromString(self::extractSections($refl->getDocComment()));
}
return self::$cache[$key];
}
/**
*
* @param $obj
* @param $method
* @return unknown_type
*/
public static function getMethodAnnotations($obj, $method) {
if (trim($method) == '')
throw new InvalidArgumentException('Method name must not be empty.');
$key = 'methd_'.get_class($obj).'_'.$method;
if (!isset(self::$cache[$key])) {
$refl = new ReflectionMethod($obj, $method);
self::$cache[$key] = self::getAnnotationsFromString(self::extractSections($refl->getDocComment()));
}
return self::$cache[$key];
}
/**
*
* @param $class
* @return unknown_type
*/
public static function getClassAnnotations($obj) {
$class = get_class($obj);
if (trim($class) == '')
throw new InvalidArgumentException('Class name must not be empty.');
$key = 'class_'.$class;
if (!isset(self::$cache[$key])) {
$refl = new ReflectionClass($obj);
self::$cache[$key] = self::getAnnotationsFromString(self::extractSections($refl->getDocComment()));
}
return self::$cache[$key];
}
/**
*
* @param $class
* @param $annotation
* @return unknown_type
*/
public static function getClassAnnotation($class, $annotation) {
$annots = self::getClassAnnotations($class);
return $annots[strtolower($annotation)];
}
/**
*
* @param $obj
* @param $method
* @param $annotation
* @return unknown_type
*/
public static function getMethodAnnotation($obj, $method, $annotation) {
$annots = self::getMethodAnnotations($obj, $method);
return $annots[strtolower($annotation)];
}
/**
*
* @param $obj
* @param $prop
* @param $annotation
* @return unknown_type
*/
public static function getPropertyAnnotation($obj, $prop, $annotation) {
$annots = self::getPropertyAnnotations($obj, $prop);
return $annots[strtolower($annotation)];
}
/**
*
* @param $class
* @return boolean
*/
public static function hasClassAnnotations($class) {
try {
return count(self::getClassAnnotations($class)) > 0;
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $method
* @return boolean
*/
public static function hasMethodAnnotations($obj, $method) {
try {
return count(self::getMethodAnnotations($obj, $method)) > 0;
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $prop
* @return boolean
*/
public static function hasPropertyAnnotations($obj, $prop) {
try {
return count(self::getPropertyAnnotations($obj, $prop)) > 0;
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $class
* @param $annotation
* @return boolean
*/
public static function hasClassAnnotation($class, $annotation) {
try {
$annots = self::getClassAnnotations($class);
return isset($annots[strtolower($annotation)]);
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $method
* @param $annotation
* @return boolean
*/
public static function hasMethodAnnotation($obj, $method, $annotation) {
try {
$annots = self::getMethodAnnotations($obj, $method);
return isset($annots[strtolower($annotation)]);
} catch(ParsingException $e) {
return false;
}
}
/**
*
* @param $obj
* @param $prop
* @param $annotation
* @return boolean
*/
public static function hasPropertyAnnotation($obj, $prop, $annotation) {
try {
$annots = self::getPropertyAnnotations($obj, $prop);
return isset($annots[strtolower($annotation)]);
} catch(ParsingException $e) {
return false;
}
}
}
?>