<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Zend\Di\Definition;

interface DefinitionInterface
{
    /**
     * Retrieves classes in this definition
     *
     * @abstract
     * @return string[]
     */
    public function getClasses();

    /**
     * Return whether the class exists in this definition
     *
     * @abstract
     * @param  string $class
     * @return bool
     */
    public function hasClass($class);

    /**
     * Return the supertypes for this class
     *
     * @abstract
     * @param  string   $class
     * @return string[]
     */
    public function getClassSupertypes($class);

    /**
     * @abstract
     * @param  string       $class
     * @return string|array
     */
    public function getInstantiator($class);

    /**
     * Return if there are injection methods
     *
     * @abstract
     * @param  string $class
     * @return bool
     */
    public function hasMethods($class);

    /**
     * Return an array of the injection methods for a given class
     *
     * @abstract
     * @param  string   $class
     * @return string[]
     */
    public function getMethods($class);

    /**
     * @abstract
     * @param  string $class
     * @param  string $method
     * @return bool
     */
    public function hasMethod($class, $method);

    /**
     * @abstract
     * @param $class
     * @param $method
     * @return bool
     */
    public function hasMethodParameters($class, $method);

    /**
     * getMethodParameters() return information about a methods parameters.
     *
     * Should return an ordered named array of parameters for a given method.
     * Each value should be an array, of length 4 with the following information:
     *
     * array(
     *     0, // string|null: Type Name (if it exists)
     *     1, // bool: whether this param is required
     *     2, // string: fully qualified path to this parameter
     *     3, // mixed: default value
     * );
     *
     *
     * @abstract
     * @param  string $class
     * @param  string $method
     * @return array
     */
    public function getMethodParameters($class, $method);
}