/**
  * @inheritdoc
  */
 public function filter(Service $service)
 {
     $types = array();
     $operations = array();
     foreach ($this->methods as $method) {
         $operation = $service->getOperation($method);
         if (!$operation) {
             continue;
         }
         // Discover types used in params
         foreach ($operation->getParams() as $param => $hint) {
             $arr = $operation->getPhpDocParams($param, $service->getTypes());
             $type = $service->getType($arr['type']);
             if (!empty($type)) {
                 $types[] = $type;
             }
         }
         // Discover types used in returns
         $returns = $operation->getReturns();
         $types[] = $service->getType($returns);
         foreach ($types as $type) {
             $types = array_merge($types, $this->findUsedTypes($service, $type));
         }
         // Remove duplicated using standard equality checks. Default string
         // comparison does not work here.
         $types = array_unique($types, SORT_REGULAR);
         $operations[] = $operation;
     }
     $filteredService = new Service($this->config, $service->getIdentifier(), $types, $service->getDescription());
     // Pull created service with operations
     foreach ($operations as $operation) {
         $filteredService->addOperation($operation);
     }
     return $filteredService;
 }
 /**
  * Loads the service class
  */
 protected function loadService()
 {
     $service = $this->wsdl->getService();
     $this->log('Starting to load service ' . $service->getName());
     $this->service = new Service($this->config, $service->getName(), $this->types, $service->getDocumentation());
     foreach ($this->wsdl->getOperations() as $function) {
         $this->log('Loading function ' . $function->getName());
         $this->service->addOperation(new Operation($function->getName(), $function->getParams(), $function->getDocumentation(), $function->getReturns()));
     }
     $this->log('Done loading service ' . $service->getName());
 }
 /**
  * Save all the loaded classes to the configured output dir
  *
  * @throws Exception If no service is loaded
  */
 private function savePhp()
 {
     $service = $this->service->getClass();
     if ($service == null) {
         throw new Exception('No service loaded');
     }
     $output = new OutputManager($this->config);
     // Generate all type classes
     $types = array();
     foreach ($this->types as $type) {
         $class = $type->getClass();
         if ($class != null) {
             $types[] = $class;
             if (!$this->config->getOneFile() && !$this->config->getNoIncludes()) {
                 $service->addDependency($class->getIdentifier() . '.php');
             }
         }
     }
     $output->save($service, $types);
 }
 /**
  * Setup and return a service with operations and types.
  *
  * @return Service
  */
 private function givenServiceWithOperations()
 {
     // Response GetBook types
     $responseBookName = new ComplexType($this->config, 'Method_Get_Book_Response_BOOK_BOOK_NAME');
     $responseBookName->addMember('string', 'bookName', false);
     $responseBook = new ComplexType($this->config, 'Method_Get_Book_Response_BOOK');
     $responseBook->addMember('int', 'bookId', false);
     // Base type example
     $responseBook->setBaseType($responseBookName);
     $returnGetBookType = new ComplexType($this->config, 'Get_Book_Type_Response');
     $returnGetBookType->addMember('Method_Get_Book_Response_BOOK', 'book_response', false);
     // Request GetBook types
     $bookType = new Enum($this->config, 'Book_Type_Enumeration', 'string');
     $bookType->addValue('fiction');
     $bookType->addValue('comedy');
     $requestBook = new ComplexType($this->config, 'Method_Get_Book_Request_BOOK');
     $requestBook->addMember('int', 'bookId', false);
     $requestBook->addMember('Book_Type_Enumeration', 'genre', false);
     $requestGetBook = new ComplexType($this->config, 'Get_Book_Type_Request');
     $requestGetBook->addMember('Method_Get_Book_Request_BOOK', 'book_request', false);
     // Operation GetBook
     $getBookOperation = new Operation('GetBook', 'Get_Book_Type_Request $request', 'Get Book', 'Get_Book_Type_Response');
     // Response GetAuthors type
     $responseAuthor = new ComplexType($this->config, 'Get_Authors_Response_Author');
     $responseAuthor->addMember('int', 'authorId', false);
     $responseAuthor->addMember('string', 'authorName', false);
     $returnGetAuthors = new ComplexType($this->config, 'Method_Get_Authors_Response');
     $returnGetAuthors->addMember('Get_Authors_Response_Author[]', 'Get_Authors_Response_Author', false);
     // Request GetAuthors type
     $requestGetAuthor = new ComplexType($this->config, 'Method_Get_Authors_Request');
     $requestGetAuthor->addMember('Method_Get_Book_Request_BOOK', 'book_request', false);
     // Operation GetAuthors
     $getAuthorsOperator = new Operation('GetAuthor', 'Method_Get_Authors_Request $request', 'Get Authors', 'Method_Get_Authors_Response');
     // Service creation
     $types = array($responseBookName, $responseBook, $returnGetBookType, $requestBook, $requestGetBook, $responseAuthor, $returnGetAuthors, $requestGetAuthor, $bookType);
     $service = new Service($this->config, 'Book_Shell', $types, 'Book shells');
     $service->addOperation($getBookOperation);
     $service->addOperation($getAuthorsOperator);
     return $service;
 }