public function all(Specification $spec = null)
 {
     if ($spec === null) {
         $spec = new Specification();
     }
     $methods = [];
     foreach ($this->methods as $method) {
         if ($spec->satisfy($method)) {
             $methods[$method->name] = $method;
         }
     }
     $parentSpec = new Specification($spec->getParentMode(), $spec->isStatic(), $spec->isMagic());
     if ($this->class instanceof ClassData) {
         $parent = $this->class->getParent();
         if ($parent instanceof ClassData) {
             $parentM = $parent->methods->all($parentSpec);
             $methods = array_merge($parentM, $methods);
         }
     }
     foreach ($this->class->getInterfaces() as $interface) {
         if ($interface instanceof InterfaceData) {
             $parentM = $interface->methods->all($parentSpec);
             $methods = array_merge($parentM, $methods);
         }
     }
     return $methods;
 }
 public function get($propName, Specification $spec = null)
 {
     if ($spec === null) {
         $spec = new Specification('private', 2, false);
     }
     if (array_key_exists($propName, $this->map)) {
         $prop = $this->map[$propName];
         if ($spec->satisfy($prop)) {
             return $prop;
         }
         return null;
     }
     $parent = $this->class->getParent();
     if ($parent instanceof ClassData) {
         return $parent->properties->get($propName, new Specification($spec->getParentMode(), $spec->isStatic(), $spec->isMagic()));
     }
 }