protected function buildParameters($className)
    {
        /** @var \Pok\PoolDBM\Mapping\ClassMetadata $metadata */
        $metadata = $this->getModelManager()->getClassMetadata($className);

        $managers = array();
        foreach ($metadata->getFieldMappings() as $model) {

            $managers[$model->getManagerName()] = array(
                'namespace' => '\\' . $model->getName(),
                'methods'   => array()
            );

            $fields = $model->getFields();
            if ($metadata->getManagerIdentifier() === $model->getManagerName()) {
                $fields[] = $metadata->getFieldIdentifier();
            }

            $pattern = self::patternDeclared($fields);

            $refl = new \ReflectionClass($model->getName());
            foreach ($refl->getMethods() as $method) {
                if (!$method->isPublic() || $method->isStatic() || $method->isConstructor() || $method->isDestructor() || $method->isAbstract()) {
                    continue;
                }

                preg_match($pattern, $method->getName(), $matches);
                if (empty($matches)) {
                    continue;
                }

                $arg = array(
                    'comment'    => $method->getDocComment(),
                    'name'       => $method->getName(),
                    'type'       => in_array($matches[1], array('get','is','has','all','check')) ? 'getter' : 'setter',
                    'arguments'  => Reflector::parameters($method->getParameters()),
                    'parameters' => $method->getParameters()
                );

                $managers[$model->getManagerName()]['methods'][] = $arg;
            }
        }

        $associations = new Bag();
        foreach ($metadata->getAssociationDefinitions() as $definition) {
            if ($definition->isMany()) {
                $associations->many[$definition->getField()] = array(
                    'fields'    => $definition->getReferences(),
                    'className' => $definition->getTargetMultiModel()
                );
            } else {
                $associations->one[$definition->getField()] = array(
                    'className' => $definition->getTargetMultiModel()
                );
            }
        }

        $occ = strrpos($metadata->getName(), '\\');

        return array(
            'model_namespace'   => substr($metadata->getName(), 0, $occ),
            'model_name'        => substr($metadata->getName(), $occ + 1),
            'managers'          => $managers,
            'associations'      => $associations
        );
    }