Source for file v1.php
Documentation is available at v1.php
* PEAR_PackageFile_v1, package.xml version 1.0
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: v1.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
require_once 'PEAR/ErrorStack.php';
* Error code if parsing is attempted with no xml extension
define('PEAR_PACKAGEFILE_ERROR_NO_XML_EXT', 3 );
* Error code if creating the xml parser resource fails
define('PEAR_PACKAGEFILE_ERROR_CANT_MAKE_PARSER', 4 );
* Error code used for all sax xml parsing errors
define('PEAR_PACKAGEFILE_ERROR_PARSER_ERROR', 5 );
* Error code used when there is no name
define('PEAR_PACKAGEFILE_ERROR_NO_NAME', 6 );
* Error code when a package name is not valid
define('PEAR_PACKAGEFILE_ERROR_INVALID_NAME', 7 );
* Error code used when no summary is parsed
define('PEAR_PACKAGEFILE_ERROR_NO_SUMMARY', 8 );
* Error code for summaries that are more than 1 line
define('PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY', 9 );
* Error code used when no description is present
define('PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION', 10 );
* Error code used when no license is present
define('PEAR_PACKAGEFILE_ERROR_NO_LICENSE', 11 );
* Error code used when a <version> version number is not present
define('PEAR_PACKAGEFILE_ERROR_NO_VERSION', 12 );
* Error code used when a <version> version number is invalid
define('PEAR_PACKAGEFILE_ERROR_INVALID_VERSION', 13 );
* Error code when release state is missing
define('PEAR_PACKAGEFILE_ERROR_NO_STATE', 14 );
* Error code when release state is invalid
define('PEAR_PACKAGEFILE_ERROR_INVALID_STATE', 15 );
* Error code when release state is missing
define('PEAR_PACKAGEFILE_ERROR_NO_DATE', 16 );
* Error code when release state is invalid
define('PEAR_PACKAGEFILE_ERROR_INVALID_DATE', 17 );
* Error code when no release notes are found
define('PEAR_PACKAGEFILE_ERROR_NO_NOTES', 18 );
* Error code when no maintainers are found
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS', 19 );
* Error code when a maintainer has no handle
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE', 20 );
* Error code when a maintainer has no handle
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE', 21 );
* Error code when a maintainer has no name
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME', 22 );
* Error code when a maintainer has no email
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL', 23 );
* Error code when a maintainer has no handle
define('PEAR_PACKAGEFILE_ERROR_INVALID_MAINTROLE', 24 );
* Error code when a dependency is not a PHP dependency, but has no name
define('PEAR_PACKAGEFILE_ERROR_NO_DEPNAME', 25 );
* Error code when a dependency has no type (pkg, php, etc.)
define('PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE', 26 );
* Error code when a dependency has no relation (lt, ge, has, etc.)
define('PEAR_PACKAGEFILE_ERROR_NO_DEPREL', 27 );
* Error code when a dependency is not a 'has' relation, but has no version
define('PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION', 28 );
* Error code when a dependency has an invalid relation
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPREL', 29 );
* Error code when a dependency has an invalid type
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPTYPE', 30 );
* Error code when a dependency has an invalid optional option
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL', 31 );
* Error code when a dependency is a pkg dependency, and has an invalid package name
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPNAME', 32 );
* Error code when a dependency has a channel="foo" attribute, and foo is not a registered channel
define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_DEPCHANNEL', 33 );
* Error code when rel="has" and version attribute is present.
define('PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED', 34 );
* Error code when type="php" and dependency name is present
define('PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED', 35 );
* Error code when a configure option has no name
define('PEAR_PACKAGEFILE_ERROR_NO_CONFNAME', 36 );
* Error code when a configure option has no name
define('PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT', 37 );
* Error code when a file in the filelist has an invalid role
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE', 38 );
* Error code when a file in the filelist has no role
define('PEAR_PACKAGEFILE_ERROR_NO_FILEROLE', 39 );
* Error code when analyzing a php source file that has parse errors
define('PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE', 40 );
* Error code when analyzing a php source file reveals a source element
* without a package name prefix
define('PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX', 41 );
* Error code when an unknown channel is specified
define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_CHANNEL', 42 );
* Error code when no files are found in the filelist
define('PEAR_PACKAGEFILE_ERROR_NO_FILES', 43 );
* Error code when a file is not valid php according to _analyzeSourceCode()
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILE', 44 );
* Error code when the channel validator returns an error or warning
define('PEAR_PACKAGEFILE_ERROR_CHANNELVAL', 45 );
* Error code when a php5 package is packaged in php4 (analysis doesn't work)
define('PEAR_PACKAGEFILE_ERROR_PHP5', 46 );
* Error code when a file is listed in package.xml but does not exist
define('PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND', 47 );
* Error code when a <dep type="php" rel="not"... is encountered (use rel="ne")
define('PEAR_PACKAGEFILE_PHP_NO_NOT', 48 );
* Error code when a package.xml contains non-ISO-8859-1 characters
define('PEAR_PACKAGEFILE_ERROR_NON_ISO_CHARS', 49 );
* Error code when a dependency is not a 'has' relation, but has no version
define('PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION', 50 );
* Error code when a package has no lead developer
define('PEAR_PACKAGEFILE_ERROR_NO_LEAD', 51 );
* Error code when a filename begins with "."
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME', 52 );
* package.xml encapsulator
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
* A registry object, used to access the package name validation regex for non-standard channels
* An object that contains a log method that matches PEAR_Common::log's signature
* Parsed package information
* path to package .tgz or false if this is a local/extracted package.xml
* Determines whether this packagefile was initialized only with partial package info
* If this package file was constructed via parsing REST, it will only contain
* @param bool determines whether to return a PEAR_Error object, or use the PEAR_ErrorStack
* @param string Name of Error Stack class to use.
$this->_config = &$config;
$this->_registry = &$config->getRegistry ();
* For saving in the registry.
* Set the last version that was installed
$this->_packageInfo['_lastversion'] = $version;
if (isset ($this->_packageInfo['_lastversion'])) {
return $this->_packageInfo['_lastversion'];
return PEAR::raiseError('Logger must be compatible with PEAR_Common::log');
$this->_logger = &$logger;
$this->_packageFile = $file;
$this->_archiveFile = $archive ? $archive : $file;
return isset ($this->_packageFile) ? $this->_packageFile : false;
return $this->_archiveFile;
!isset ($this->_packageInfo[$field])) {
return $this->_packageInfo[$field];
if (!isset ($this->_packageInfo['dirtree'])) {
$this->_packageInfo['dirtree'] = array ();
$this->_packageInfo['dirtree'][$path] = true;
if (isset ($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) {
return $this->_packageInfo['dirtree'];
unset ($this->_packageInfo['dirtree']);
$this->_incomplete = false;
$this->_packageInfo = $pinfo;
return $this->_incomplete;
if (isset ($this->_packageInfo['extends'])) {
return $this->_packageInfo['extends'];
return $this->_packageInfo;
if (isset ($this->_packageInfo['package'])) {
return $this->_packageInfo['package'];
* WARNING - don't use this unless you know what you are doing
$this->_packageInfo['package'] = $package;
$this->_packageInfo['package'] = $package;
if (isset ($this->_packageInfo['version'])) {
return $this->_packageInfo['version'];
$this->_packageInfo['version'] = $version;
unset ($this->_packageInfo['maintainers']);
if (isset ($this->_packageInfo['maintainers'])) {
return $this->_packageInfo['maintainers'];
* Adds a new maintainer - no checking of duplicates is performed, use
* updatemaintainer for that purpose.
$this->_packageInfo['maintainers'][] =
array ('handle' => $handle, 'role' => $role, 'email' => $email, 'name' => $name);
if (!isset ($this->_packageInfo['maintainers']) ||
!is_array($this->_packageInfo['maintainers'])) {
foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) {
if ($maintainer['handle'] == $handle) {
unset ($this->_packageInfo['maintainers'][$found]);
$this->_packageInfo['maintainers'] =
foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) {
if ($maintainer['handle'] == $handle) {
unset ($this->_packageInfo['maintainers'][$found]);
$this->_packageInfo['maintainers'] =
if (isset ($this->_packageInfo['release_state'])) {
return $this->_packageInfo['release_state'];
$this->_packageInfo['release_state'] = $state;
$this->_packageInfo['release_state'] = $state;
if (isset ($this->_packageInfo['release_date'])) {
return $this->_packageInfo['release_date'];
$this->_packageInfo['release_date'] = $date;
if (isset ($this->_packageInfo['release_license'])) {
return $this->_packageInfo['release_license'];
$this->_packageInfo['release_license'] = $date;
if (isset ($this->_packageInfo['summary'])) {
return $this->_packageInfo['summary'];
$this->_packageInfo['summary'] = $summary;
if (isset ($this->_packageInfo['description'])) {
return $this->_packageInfo['description'];
$this->_packageInfo['description'] = $desc;
if (isset ($this->_packageInfo['release_notes'])) {
return $this->_packageInfo['release_notes'];
$this->_packageInfo['release_notes'] = $notes;
if (isset ($this->_packageInfo['release_deps'])) {
return $this->_packageInfo['release_deps'];
* Reset dependencies prior to adding new ones
unset ($this->_packageInfo['release_deps']);
$this->_packageInfo['release_deps'][] =
'optional' => $optional);
if ($rel != 'has' && $rel != 'not') {
$dep['version'] = $version;
$this->_packageInfo['release_deps'][] = $dep;
$this->_packageInfo['release_deps'][] =
'optional' => $optional);
* WARNING - do not use this function directly unless you know what you're doing
$this->_packageInfo['release_deps'] = $deps;
return isset ($this->_packageInfo['release_deps']) &&
count($this->_packageInfo['release_deps']);
return $p->isSubpackage ($this);
foreach ($deps as $dep) {
if ($dep['type'] != 'pkg') {
if (isset ($this->_packageInfo['configure_options'])) {
return $this->_packageInfo['configure_options'];
return isset ($this->_packageInfo['configure_options']) &&
count($this->_packageInfo['configure_options']);
$o = array ('name' => $name, 'prompt' => $prompt);
if ($default !== false ) {
$o['default'] = $default;
if (!isset ($this->_packageInfo['configure_options'])) {
$this->_packageInfo['configure_options'] = array ();
$this->_packageInfo['configure_options'][] = $o;
unset ($this->_packageInfo['configure_options']);
if (isset ($this->_packageInfo['provides'])) {
return $this->_packageInfo['provides'];
function addFile($dir, $file, $attrs)
$dir = preg_replace(array ('!\\\\+!', '!/+!'), array ('/', '/'), $dir);
if ($dir == '/' || $dir == '') {
$this->_packageInfo['filelist'][$file] = $attrs;
if (isset ($this->_packageInfo['filelist'])) {
return $this->_packageInfo['filelist'];
$this->_packageInfo['filelist'][$file][$attr] = $value;
$this->_packageInfo['filelist'] = array ();
return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
unset ($this->_packageInfo['filelist'][$file]['installed_as']);
if (isset ($this->_packageInfo['filelist'][$file])) {
$this->_packageInfo['filelist'][$file] =
array_merge($this->_packageInfo['filelist'][$file], $atts);
$this->_packageInfo['filelist'][$file] = $atts;
if (isset ($this->_packageInfo['changelog'])) {
return $this->_packageInfo['changelog'];
* Wrapper to {@link PEAR_ErrorStack::getErrors()}
* @param boolean determines whether to purge the error stack after retrieving
return $this->_stack->getErrors ($purge);
* Validation error. Also marks the object contents as invalid
* @param array error information
function _validateError ($code, $params = array ())
$this->_stack->push ($code, 'error', $params, false , false , debug_backtrace());
* Validation warning. Does not mark the object contents invalid.
* @param array error information
function _validateWarning ($code, $params = array ())
$this->_stack->push ($code, 'warning', $params, false , false , debug_backtrace());
* @param integer error code
'Summary should be on one line',
'No release version found',
'No release state found',
'No release notes found',
'Package must have at least one lead maintainer',
'No maintainers found, at least one must be defined',
'Maintainer %index% has no handle (user ID at channel server)',
'Maintainer %index% has no role',
'Maintainer %index% has no name',
'Maintainer %index% has no email',
'Dependency %index% is not a php dependency, and has no name',
'Dependency %index% has no relation (rel)',
'Dependency %index% has no type',
'PHP Dependency %index% has a name attribute of "%name%" which will be' .
'Dependency %index% is not a rel="has" or rel="not" dependency, ' .
'Dependency %index% is a type="php" dependency, ' .
'Dependency %index% is a rel="%rel%" dependency, versioning is ignored',
'Dependency %index% has invalid optional value "%opt%", should be yes or no',
'Dependency %index%: php dependencies cannot use "not" rel, use "ne"' .
' to exclude specific versions',
'Configure Option %index% has no name',
'Configure Option %index% has no prompt',
'No files in <filelist> section of package.xml',
'File "%file%" has no role, expecting one of "%roles%"',
'File "%file%" has invalid role "%role%", expecting one of "%roles%"',
'File "%file%" cannot start with ".", cannot package or install',
'Parser error: invalid PHP found in file "%file%"',
'in %file%: %type% "%name%" not prefixed with package name "%package%"',
'Parser error: invalid PHP file "%file%"',
'Channel validator error: field "%field%" - %reason%',
'Error, PHP5 token encountered in %file%, analysis should be in PHP5',
'File "%file%" in package.xml does not exist',
'Package.xml contains non-ISO-8859-1 characters, and may not validate',
* Validate XML package definition file.
function validate($state = PEAR_VALIDATE_NORMAL , $nofilechecking = false )
if (($this->_isValid & $state) == $state) {
$info = $this->_packageInfo;
if (empty ($info['package'])) {
$this->_packageName = $pn = 'unknown';
$this->_packageName = $pn = $info['package'];
if (empty ($info['summary'])) {
} elseif (strpos(trim($info['summary']), "\n") !== false ) {
array ('summary' => $info['summary']));
if (empty ($info['description'])) {
if (empty ($info['release_license'])) {
if (empty ($info['version'])) {
if (empty ($info['release_state'])) {
if (empty ($info['release_date'])) {
if (empty ($info['release_notes'])) {
if (empty ($info['maintainers'])) {
foreach ($info['maintainers'] as $m) {
if (empty ($m['handle'])) {
} elseif ($m['role'] == 'lead') {
if (empty ($m['email'])) {
if (!empty ($info['release_deps'])) {
foreach ($info['release_deps'] as $d) {
if (!isset ($d['type']) || empty ($d['type'])) {
if (!isset ($d['rel']) || empty ($d['rel'])) {
if (!empty ($d['optional'])) {
if (!in_array($d['optional'], array ('yes', 'no'))) {
array ('index' => $i, 'opt' => $d['optional']));
if ($d['rel'] != 'has' && $d['rel'] != 'not' && empty ($d['version'])) {
} elseif (($d['rel'] == 'has' || $d['rel'] == 'not') && !empty ($d['version'])) {
array ('index' => $i, 'rel' => $d['rel']));
if ($d['type'] == 'php' && !empty ($d['name'])) {
array ('index' => $i, 'name' => $d['name']));
} elseif ($d['type'] != 'php' && empty ($d['name'])) {
if ($d['type'] == 'php' && empty ($d['version'])) {
if (($d['rel'] == 'not') && ($d['type'] == 'php')) {
if (!empty ($info['configure_options'])) {
foreach ($info['configure_options'] as $c) {
if (empty ($c['prompt'])) {
if (empty ($info['filelist'])) {
foreach ($info['filelist'] as $file => $fa) {
if (empty ($fa['role'])) {
// file contains .. parent directory or . cur directory references
if (isset ($fa['install-as']) &&
// install-as contains .. parent directory or . cur directory references
array ('file' => $file . ' [installed as ' . $fa['install-as'] . ']'));
if (isset ($fa['baseinstalldir']) &&
// install-as contains .. parent directory or . cur directory references
array ('file' => $file . ' [baseinstalldir ' . $fa['baseinstalldir'] . ']'));
if (isset ($this->_registry) && $this->_isValid) {
$chan = $this->_registry->getChannel('pear.php.net');
return $this->_isValid = 0;
$validator = $chan->getValidationObject ();
$validator->setPackageFile ($this);
$validator->validate ($state);
$failures = $validator->getFailures ();
foreach ($failures['errors'] as $error) {
foreach ($failures['warnings'] as $warning) {
if ($this->_analyzePhpFiles ()) {
return $this->_isValid = $state;
return $this->_isValid = 0;
function _analyzePhpFiles ()
if (!isset ($this->_packageFile)) {
$dir_prefix = dirname($this->_packageFile);
$log = isset ($this->_logger) ? array (&$this->_logger, 'log') :
foreach ($info as $file => $fa) {
if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $file)) {
array ('file' => realpath($dir_prefix) . DIRECTORY_SEPARATOR . $file));
if ($fa['role'] == 'php' && $dir_prefix) {
$srcinfo = $this->_analyzeSourceCode ($dir_prefix . DIRECTORY_SEPARATOR . $file);
$this->_buildProvidesArray ($srcinfo);
if (isset ($this->_packageInfo['provides'])) {
foreach ((array) $this->_packageInfo['provides'] as $key => $what) {
if (isset ($what['explicit'])) {
// skip conformance checks if the provides entry is
// specified in the package.xml file
array ('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn));
} elseif ($type == 'function') {
array ('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn));
* Get the default xml generator object
* @return PEAR_PackageFile_Generator_v1
require_once 'PEAR/PackageFile/Generator/v1.php';
* Get the contents of a file listed within the package.xml
if ($this->_archiveFile == $this->_packageFile) { // unpacked
$dir = dirname($this->_packageFile);
$file = $dir . DIRECTORY_SEPARATOR . $file;
array (DIRECTORY_SEPARATOR , DIRECTORY_SEPARATOR ), $file);
require_once 'Archive/Tar.php';
$tar = &new Archive_Tar ($this->_archiveFile);
if ($file != 'package.xml' && $file != 'package2.xml') {
$file = $tar->extractInString ($file);
$tar->popErrorHandling ();
// {{{ analyzeSourceCode()
* Analyze the source code of the given PHP file
* @param string Filename of the PHP file
function _analyzeSourceCode ($file)
define('T_DOC_COMMENT', T_COMMENT );
if (!$fp = @fopen($file, "r")) {
for ($i = 0; $i < sizeof($tokens); $i++) {
@list($token, $data) = $tokens[$i];
print token_name($token) . ' ';
$current_class_level = -1;
$current_function_level = -1;
$declared_classes = array ();
$declared_interfaces = array ();
$declared_functions = array ();
$declared_methods = array ();
$used_functions = array ();
for ($i = 0; $i < sizeof($tokens); $i++ ) {
list ($token, $data) = $tokens[$i];
if ($token != '"' && $token != T_END_HEREDOC ) {
$current_function_level = -1;
case T_DOLLAR_OPEN_CURLY_BRACES:
case '{': $brace_level++; continue 2;
if ($current_class_level == $brace_level) {
$current_class_level = -1;
if ($current_function_level == $brace_level) {
$current_function_level = -1;
case '[': $bracket_level++; continue 2;
case ']': $bracket_level--; continue 2;
case '(': $paren_level++; continue 2;
case ')': $paren_level--; continue 2;
if (($current_class_level != -1 ) || ($current_function_level != -1 )) {
array ('public', 'private', 'protected', 'abstract',
'interface', 'implements', 'throw')
if ($look_for == T_CLASS ) {
$current_class_level = $brace_level;
$declared_classes[] = $current_class;
} elseif ($look_for == T_INTERFACE ) {
$current_interface = $data;
$current_class_level = $brace_level;
$declared_interfaces[] = $current_interface;
} elseif ($look_for == T_IMPLEMENTS ) {
$implements[$current_class] = $data;
} elseif ($look_for == T_EXTENDS ) {
$extends[$current_class] = $data;
} elseif ($look_for == T_FUNCTION ) {
$current_function = " $current_class::$data";
$declared_methods[$current_class][] = $data;
} elseif ($current_interface) {
$current_function = " $current_interface::$data";
$declared_methods[$current_interface][] = $data;
$current_function = $data;
$declared_functions[] = $current_function;
$current_function_level = $brace_level;
} elseif ($look_for == T_NEW ) {
$used_classes[$data] = true;
if (!($tokens[$i - 1 ][0 ] == T_WHITESPACE || $tokens[$i - 1 ][0 ] == T_STRING )) {
$class = $tokens[$i - 1 ][1 ];
$used_classes[$class] = true;
"declared_classes" => $declared_classes,
"declared_interfaces" => $declared_interfaces,
"declared_methods" => $declared_methods,
"declared_functions" => $declared_functions,
"inheritance" => $extends,
"implements" => $implements,
* Build a "provides" array from data returned by
* analyzeSourceCode(). The format of the built array is like
* 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
* @param array $srcinfo array with information about a source file
* as returned by the analyzeSourceCode() method.
function _buildProvidesArray ($srcinfo)
$file = basename($srcinfo['source_file']);
foreach ($srcinfo['declared_classes'] as $class) {
if (isset ($this->_packageInfo['provides'][$key])) {
$this->_packageInfo['provides'][$key] =
array ('file'=> $file, 'type' => 'class', 'name' => $class);
if (isset ($srcinfo['inheritance'][$class])) {
$this->_packageInfo['provides'][$key]['extends'] =
$srcinfo['inheritance'][$class];
foreach ($srcinfo['declared_methods'] as $class => $methods) {
foreach ($methods as $method) {
$function = " $class::$method";
$key = " function;$function";
if ($method{0 } == '_' || !strcasecmp($method, $class) ||
isset ($this->_packageInfo['provides'][$key])) {
$this->_packageInfo['provides'][$key] =
array ('file'=> $file, 'type' => 'function', 'name' => $function);
foreach ($srcinfo['declared_functions'] as $function) {
$key = " function;$function";
if ($function{0 } == '_' || isset ($this->_packageInfo['provides'][$key])) {
$warnings[] = "in1 " . $file . " : function \"$function\" not prefixed with package name \"$pn\"";
$this->_packageInfo['provides'][$key] =
array ('file'=> $file, 'type' => 'function', 'name' => $function);
Documentation generated on Wed, 06 Jul 2011 23:31:28 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.
|