The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#
# /*
# * *********** WARNING **************
# * This file generated by ModPerl::WrapXS/0.01
# * Any changes made here will be lost
# * ***********************************
# * 01: lib/ModPerl/Code.pm:716
# * 02: lib/ModPerl/WrapXS.pm:765
# * 03: lib/ModPerl/WrapXS.pm:1189
# * 04: Makefile.PL:435
# * 05: Makefile.PL:333
# * 06: Makefile.PL:59
# */
#
use strict;
my $methods = {
'BINMODE' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'CLEAR' => [
[
'APR::Table',
'APR::Table'
]
],
'CLOSE' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'DELETE' => [
[
'APR::Table',
'APR::Table'
]
],
'DESTROY' => [
[
'APR::Pool',
'APR::Pool'
],
[
'APR::ThreadMutex',
'APR::ThreadMutex'
],
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
],
[
'Apache2::SubRequest',
'Apache2::SubRequest'
]
],
'EXISTS' => [
[
'APR::Table',
'APR::Table'
]
],
'FETCH' => [
[
'APR::Table',
'APR::Table'
]
],
'FILENO' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'FIRSTKEY' => [
[
'APR::Table',
'APR::Table'
]
],
'GETC' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'LOG_MARK' => [
[
'Apache2::Log',
undef
]
],
'MODIFY_CODE_ATTRIBUTES' => [
[
'Apache2::Filter',
undef
]
],
'NEXTKEY' => [
[
'APR::Table',
'APR::Table'
]
],
'OPEN' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'PRINT' => [
[
'Apache2::Filter',
'Apache2::Filter'
],
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'PRINTF' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'READ' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'STORE' => [
[
'APR::Table',
'APR::Table'
]
],
'TIEHANDLE' => [
[
'Apache2::Filter',
'Apache2::Filter'
],
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'UNTIE' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'WRITE' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'aborted' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'add' => [
[
'APR::Table',
'APR::Table'
],
[
'Apache2::Module',
'Apache2::Module'
]
],
'add_config' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'add_input_filter' => [
[
'Apache2::Filter',
'Apache2::Connection'
],
[
'Apache2::Filter',
'Apache2::RequestRec'
]
],
'add_output_filter' => [
[
'Apache2::Filter',
'Apache2::Connection'
],
[
'Apache2::Filter',
'Apache2::RequestRec'
]
],
'add_version_component' => [
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'addrs' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'alert' => [
[
'Apache2::Log',
undef
]
],
'allow_methods' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'allow_options' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'allow_override_opts' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'allow_overrides' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'allowed' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'allowed_methods' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'allowed_xmethods' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'ap_api_major_version' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'ap_api_minor_version' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'ap_auth_type' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'args' => [
[
'Apache2::Directive',
'Apache2::Directive'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'args_how' => [
[
'Apache2::Command',
'Apache2::Command'
]
],
'as_hash' => [
[
'Apache2::Directive',
'Apache2::Directive'
]
],
'as_string' => [
[
'Apache2::Directive',
'Apache2::Directive'
],
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'assbackwards' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'atime' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'auth_name' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'auth_type' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'base_server' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'bind' => [
[
'APR::Socket',
'APR::Socket'
]
],
'bucket_alloc' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'bytes_sent' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'c' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'cfg' => [
[
'ModPerl::TiPool',
'ModPerl::TiPool'
]
],
'check_cmd_context' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
]
],
'child_terminate' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'cleanup' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'cleanup_for_exec' => [
[
'APR::Pool',
'APR::Pool'
]
],
'cleanup_register' => [
[
'APR::Pool',
'APR::Pool'
]
],
'clear' => [
[
'APR::Pool',
'APR::Pool'
],
[
'APR::Table',
'APR::Table'
]
],
'client_addr' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'client_ip' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'client_socket' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'close' => [
[
'APR::Socket',
'APR::Socket'
]
],
'cmd' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
]
],
'cmds' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'compress' => [
[
'APR::Table',
'APR::Table'
]
],
'concat' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'conftree' => [
[
'Apache2::Directive',
'Apache2::Directive'
]
],
'conn_config' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'connect' => [
[
'APR::Socket',
'APR::Socket'
]
],
'connection' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'construct_server' => [
[
'Apache2::URI',
'Apache2::RequestRec'
]
],
'construct_url' => [
[
'Apache2::URI',
'Apache2::RequestRec'
]
],
'content_encoding' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'content_languages' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'content_type' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'context' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'copy' => [
[
'APR::Table',
'APR::Table'
]
],
'crit' => [
[
'Apache2::Log',
undef
]
],
'csize' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'ctime' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'ctx' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'current' => [
[
'ModPerl::Interpreter',
'ModPerl::Interpreter'
]
],
'current_callback' => [
[
'ModPerl::Util',
'ModPerl::Util'
]
],
'current_perl_id' => [
[
'ModPerl::Util',
'ModPerl::Util'
]
],
'current_thread_id' => [
[
'APR::OS',
'APR::OS'
]
],
'custom_response' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'data' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'debug' => [
[
'Apache2::Log',
undef
]
],
'decode' => [
[
'APR::Base64',
undef
]
],
'delete' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'destroy' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'APR::Bucket',
'APR::Bucket'
],
[
'APR::BucketAlloc',
'APR::BucketAlloc'
],
[
'APR::Pool',
'APR::Pool'
]
],
'device' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'die' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'dir_config' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'directive' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::Directive',
'Apache2::Directive'
]
],
'discard_request_body' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'do' => [
[
'APR::Table',
'APR::Table'
]
],
'document_root' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'emerg' => [
[
'Apache2::Log',
undef
]
],
'encode' => [
[
'APR::Base64',
undef
]
],
'encode_len' => [
[
'APR::Base64',
'APR::Base64'
]
],
'eos_create' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'equal' => [
[
'APR::SockAddr',
'APR::SockAddr'
]
],
'err_headers_out' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'errmsg' => [
[
'Apache2::Command',
'Apache2::Command'
]
],
'error' => [
[
'Apache2::Log',
undef
]
],
'error_fname' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'error_log2stderr' => [
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'escape_path' => [
[
'Apache2::Util',
'Apache2::Util'
]
],
'exists_config_define' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'fflush' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'filename' => [
[
'Apache2::Directive',
'Apache2::Directive'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'filepath_name_get' => [
[
'APR::Util',
'APR::Util'
]
],
'filetype' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'filter_flush' => [
[
'Apache2::Filter',
'APR::Brigade'
]
],
'find_linked_module' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'finfo' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'first' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'first_child' => [
[
'Apache2::Directive',
'Apache2::Directive'
]
],
'flatten' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'flush_create' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'fname' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'format' => [
[
'APR::UUID',
undef
]
],
'format_size' => [
[
'APR::String',
'APR::String'
]
],
'fragment' => [
[
'APR::URI',
'APR::URI'
]
],
'frec' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'get' => [
[
'APR::Table',
undef
]
],
'get_basic_auth_pw' => [
[
'Apache2::Access',
undef
]
],
'get_brigade' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'get_client_block' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'get_config' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'get_handlers' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'get_limit_req_body' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'get_remote_host' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'get_remote_logname' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'get_server_banner' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'get_server_description' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'get_server_name' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'get_server_port' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'get_server_version' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'get_status_line' => [
[
'Apache2::RequestUtil',
'Apache2::RequestUtil'
]
],
'group' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'group_id' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'handler' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'header_only' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'headers_in' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'headers_out' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'hostinfo' => [
[
'APR::URI',
'APR::URI'
]
],
'hostname' => [
[
'APR::URI',
'APR::URI'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'ht_time' => [
[
'Apache2::Util',
'Apache2::Util'
]
],
'id' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'in_use' => [
[
'ModPerl::TiPool',
'ModPerl::TiPool'
]
],
'info' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::Log',
undef
]
],
'inode' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'input_filters' => [
[
'Apache2::Connection',
'Apache2::Connection'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'insert_after' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'insert_before' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'insert_head' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'insert_tail' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'internal_fast_redirect' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'internal_redirect' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'internal_redirect_handler' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'invoke_handler' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'ip_get' => [
[
'APR::SockAddr',
'APR::SockAddr'
]
],
'is_EACCES' => [
[
'APR::Status',
'APR::Status'
]
],
'is_EAGAIN' => [
[
'APR::Status',
'APR::Status'
]
],
'is_ECONNABORTED' => [
[
'APR::Status',
'APR::Status'
]
],
'is_ECONNRESET' => [
[
'APR::Status',
'APR::Status'
]
],
'is_ENOENT' => [
[
'APR::Status',
'APR::Status'
]
],
'is_EOF' => [
[
'APR::Status',
'APR::Status'
]
],
'is_TIMEUP' => [
[
'APR::Status',
'APR::Status'
]
],
'is_ancestor' => [
[
'APR::Pool',
'APR::Pool'
]
],
'is_empty' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'is_eos' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'is_flush' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'is_initial_req' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'is_perl_option_enabled' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'is_virtual' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'keep_alive' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'keep_alive_max' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'keep_alive_timeout' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'keepalive' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'keepalives' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'last' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'length' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'APR::Bucket',
'APR::Bucket'
]
],
'limit_req_fields' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'limit_req_fieldsize' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'limit_req_line' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'line_num' => [
[
'Apache2::Directive',
'Apache2::Directive'
]
],
'listen' => [
[
'APR::Socket',
'APR::Socket'
]
],
'loaded' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'local_addr' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'local_host' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'local_ip' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'location' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'location_merge' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'lock' => [
[
'APR::ThreadMutex',
'APR::ThreadMutex'
]
],
'log' => [
[
'Apache2::Log',
'Apache2::RequestRec'
],
[
'Apache2::Log',
'Apache2::ServerRec'
]
],
'log_error' => [
[
'Apache2::Log',
undef
],
[
'Apache2::Log',
undef
]
],
'log_id' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'log_pid' => [
[
'Apache2::Log',
'Apache2::Log'
]
],
'log_reason' => [
[
'Apache2::Log',
'Apache2::RequestRec'
]
],
'log_rerror' => [
[
'Apache2::Log',
undef
]
],
'log_serror' => [
[
'Apache2::Log',
undef
]
],
'loglevel' => [
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'lookup' => [
[
'Apache2::Directive',
undef
]
],
'lookup_defaults' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'lookup_dirent' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'lookup_file' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'lookup_method_uri' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'lookup_uri' => [
[
'Apache2::SubRequest',
'Apache2::RequestRec'
]
],
'main' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'make' => [
[
'APR::Table',
'APR::Table'
]
],
'make_etag' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'max' => [
[
'ModPerl::TiPoolConfig',
'ModPerl::TiPoolConfig'
]
],
'max_requests' => [
[
'ModPerl::TiPoolConfig',
'ModPerl::TiPoolConfig'
]
],
'max_spare' => [
[
'ModPerl::TiPoolConfig',
'ModPerl::TiPoolConfig'
]
],
'meets_conditions' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'merge' => [
[
'APR::Table',
'APR::Table'
]
],
'method' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'method_is_limited' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
]
],
'method_number' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'method_register' => [
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'min_spare' => [
[
'ModPerl::TiPoolConfig',
'ModPerl::TiPoolConfig'
]
],
'mip' => [
[
'ModPerl::Interpreter',
'ModPerl::Interpreter'
]
],
'module_config' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'module_index' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'mtime' => [
[
'APR::Finfo',
'APR::Finfo'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'name' => [
[
'APR::BucketType',
'APR::BucketType'
],
[
'APR::Finfo',
'APR::Finfo'
],
[
'Apache2::Command',
'Apache2::Command'
],
[
'Apache2::FilterRec',
'Apache2::FilterRec'
],
[
'Apache2::Module',
'Apache2::Module'
]
],
'names' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'new' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'APR::Bucket',
'APR::Bucket'
],
[
'APR::BucketAlloc',
'APR::BucketAlloc'
],
[
'APR::IpSubnet',
'APR::IpSubnet'
],
[
'APR::Pool',
'APR::Pool'
],
[
'APR::ThreadMutex',
'APR::ThreadMutex'
],
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
],
[
'APR::UUID',
'APR::UUID'
],
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'next' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'Apache2::Command',
'Apache2::Command'
],
[
'Apache2::Directive',
'Apache2::Directive'
],
[
'Apache2::Filter',
'Apache2::Filter'
],
[
'Apache2::Module',
'Apache2::Module'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
],
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'nlink' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'no_cache' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'no_local_copy' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'note_auth_failure' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'note_basic_auth_failure' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'note_digest_auth_failure' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'notes' => [
[
'Apache2::Connection',
'Apache2::Connection'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'notice' => [
[
'Apache2::Log',
undef
]
],
'num_requests' => [
[
'ModPerl::Interpreter',
'ModPerl::Interpreter'
]
],
'opt_get' => [
[
'APR::Socket',
'APR::Socket'
]
],
'opt_set' => [
[
'APR::Socket',
'APR::Socket'
]
],
'output_filters' => [
[
'Apache2::Connection',
'Apache2::Connection'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'overlap' => [
[
'APR::Table',
'APR::Table'
]
],
'overlay' => [
[
'APR::Table',
'APR::Table'
]
],
'override' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
]
],
'override_opts' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
]
],
'parent' => [
[
'Apache2::Directive',
'Apache2::Directive'
],
[
'ModPerl::InterpPool',
'ModPerl::InterpPool'
]
],
'parent_get' => [
[
'APR::Pool',
'APR::Pool'
]
],
'parse' => [
[
'APR::URI',
'APR::URI'
],
[
'APR::UUID',
'APR::UUID'
]
],
'parse_http' => [
[
'APR::Date',
'APR::Date'
]
],
'parse_rfc' => [
[
'APR::Date',
'APR::Date'
]
],
'parse_uri' => [
[
'Apache2::URI',
'Apache2::RequestRec'
]
],
'parsed_uri' => [
[
'Apache2::URI',
'Apache2::RequestRec'
]
],
'pass_brigade' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'password' => [
[
'APR::URI',
'APR::URI'
]
],
'password_get' => [
[
'APR::Util',
'APR::Util'
]
],
'password_validate' => [
[
'APR::Util',
'APR::Util'
]
],
'path' => [
[
'APR::URI',
'APR::URI'
],
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'path_info' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'pconf' => [
[
'Apache2::Process',
'Apache2::Process'
]
],
'per_dir_config' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'perl' => [
[
'ModPerl::Interpreter',
'ModPerl::Interpreter'
]
],
'pnotes' => [
[
'Apache2::ConnectionUtil',
'Apache2::Connection'
],
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'pnotes_kill' => [
[
'Apache2::ConnectionUtil',
'Apache2::Connection'
],
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'poll' => [
[
'APR::Socket',
'APR::Socket'
]
],
'pool' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::Connection',
'Apache2::Connection'
],
[
'Apache2::Process',
'Apache2::Process'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'pool_get' => [
[
'APR::ThreadMutex',
'APR::ThreadMutex'
],
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
]
],
'port' => [
[
'APR::SockAddr',
'APR::SockAddr'
],
[
'APR::URI',
'APR::URI'
],
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'port_of_scheme' => [
[
'APR::URI',
'APR::URI'
]
],
'prev' => [
[
'APR::Brigade',
'APR::Brigade'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'print' => [
[
'Apache2::Filter',
'Apache2::Filter'
],
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'printf' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'process' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'protection' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'proto_input_filters' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'proto_num' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'proto_output_filters' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'protocol' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'proxyreq' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'psignature' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'push_handlers' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'puts' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'query' => [
[
'APR::URI',
'APR::URI'
],
[
'Apache2::MPM',
'Apache2::MPM'
]
],
'r' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'rationalize_mtime' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'rdlock' => [
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
]
],
'read' => [
[
'APR::Bucket',
'APR::Bucket'
],
[
'Apache2::Filter',
'Apache2::Filter'
],
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'recv' => [
[
'APR::Socket',
'APR::Socket'
]
],
'recvfrom' => [
[
'APR::Socket',
'APR::Socket'
]
],
'refcnt' => [
[
'ModPerl::Interpreter',
'ModPerl::Interpreter'
]
],
'register_auth_provider' => [
[
'Apache2::RequestUtil',
'Apache2::RequestUtil'
]
],
'register_provider' => [
[
'Apache2::Provider',
'Apache2::Provider'
]
],
'remote_host' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'remove' => [
[
'APR::Bucket',
'APR::Bucket'
],
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'remove_loaded_module' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'req_override' => [
[
'Apache2::Command',
'Apache2::Command'
]
],
'request' => [
[
'Apache2::RequestUtil',
'Apache2::RequestUtil'
]
],
'request_config' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'request_time' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'restart_count' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'rflush' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'rpath' => [
[
'APR::URI',
'APR::URI'
]
],
'run' => [
[
'Apache2::SubRequest',
'Apache2::SubRequest'
]
],
'run_access_checker' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_auth_checker' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_check_user_id' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_fixups' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_handler' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_header_parser' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_log_transaction' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_map_to_storage' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_post_read_request' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_translate_name' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'run_type_checker' => [
[
'Apache2::HookRun',
'Apache2::RequestRec'
]
],
'satisfies' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'sbh' => [
[
'Apache2::Connection',
'Apache2::Connection'
]
],
'scheme' => [
[
'APR::URI',
'APR::URI'
]
],
'seen_eos' => [
[
'Apache2::Filter',
'Apache2::Filter'
]
],
'send' => [
[
'APR::Socket',
'APR::Socket'
]
],
'send_cgi_header' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'send_error_response' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'send_mmap' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'sendfile' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'sendto' => [
[
'APR::Socket',
'APR::Socket'
]
],
'server' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
],
[
'ModPerl::InterpPool',
'ModPerl::InterpPool'
]
],
'server_admin' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'server_hostname' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'server_root_relative' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'server_scheme' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'server_shutdown_cleanup_register' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'set' => [
[
'APR::Table',
'APR::Table'
]
],
'set_basic_credentials' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'set_content_length' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'set_etag' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'set_handlers' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
],
[
'Apache2::ServerUtil',
'Apache2::ServerRec'
]
],
'set_keepalive' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'set_last_modified' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'setaside' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'setup_client_block' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'short_name' => [
[
'Apache2::Process',
'Apache2::Process'
]
],
'should_client_block' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'size' => [
[
'APR::Finfo',
'APR::Finfo'
],
[
'ModPerl::TiPool',
'ModPerl::TiPool'
]
],
'slurp_filename' => [
[
'Apache2::RequestUtil',
'Apache2::RequestRec'
]
],
'some_auth_required' => [
[
'Apache2::Access',
'Apache2::RequestRec'
]
],
'spawn_proc_prog' => [
[
'Apache2::SubProcess',
undef
]
],
'special_list_call' => [
[
'ModPerl::Global',
'ModPerl::Global'
]
],
'special_list_clear' => [
[
'ModPerl::Global',
'ModPerl::Global'
]
],
'special_list_register' => [
[
'ModPerl::Global',
'ModPerl::Global'
]
],
'split' => [
[
'APR::Brigade',
'APR::Brigade'
]
],
'start' => [
[
'APR::Bucket',
'APR::Bucket'
],
[
'ModPerl::TiPoolConfig',
'ModPerl::TiPoolConfig'
]
],
'stat' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'status' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'status_line' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'strerror' => [
[
'APR::Error',
'APR::Error'
]
],
'subprocess_env' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'tag' => [
[
'APR::Pool',
'APR::Pool'
]
],
'temp_pool' => [
[
'Apache2::CmdParms',
'Apache2::CmdParms'
]
],
'test' => [
[
'APR::IpSubnet',
'APR::IpSubnet'
]
],
'the_request' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'timeout' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'timeout_get' => [
[
'APR::Socket',
'APR::Socket'
]
],
'timeout_set' => [
[
'APR::Socket',
'APR::Socket'
]
],
'tipool' => [
[
'ModPerl::InterpPool',
'ModPerl::InterpPool'
]
],
'top_module' => [
[
'Apache2::Module',
'Apache2::Module'
]
],
'trylock' => [
[
'APR::ThreadMutex',
'APR::ThreadMutex'
]
],
'tryrdlock' => [
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
]
],
'trywrlock' => [
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
]
],
'type' => [
[
'APR::Bucket',
'APR::Bucket'
]
],
'unescape_url' => [
[
'Apache2::URI',
'Apache2::URI'
]
],
'unload_package_xs' => [
[
'ModPerl::Util',
'ModPerl::Util'
]
],
'unlock' => [
[
'APR::ThreadMutex',
'APR::ThreadMutex'
],
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
]
],
'unparse' => [
[
'APR::URI',
'APR::URI'
]
],
'unparsed_uri' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'unset' => [
[
'APR::Table',
'APR::Table'
]
],
'untaint' => [
[
'ModPerl::Util',
'ModPerl::Util'
]
],
'update_mtime' => [
[
'Apache2::Response',
'Apache2::RequestRec'
]
],
'uri' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'used_path_info' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'user' => [
[
'APR::Finfo',
'APR::Finfo'
],
[
'APR::URI',
'APR::URI'
],
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'user_id' => [
[
'Apache2::ServerUtil',
'Apache2::ServerUtil'
]
],
'useragent_addr' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'useragent_ip' => [
[
'Apache2::RequestRec',
'Apache2::RequestRec'
]
],
'valid' => [
[
'APR::Finfo',
'APR::Finfo'
]
],
'warn' => [
[
'Apache2::Log',
undef
],
[
'Apache2::Log',
undef
],
[
'Apache2::Log',
undef
]
],
'wild_names' => [
[
'Apache2::ServerRec',
'Apache2::ServerRec'
]
],
'write' => [
[
'Apache2::RequestIO',
'Apache2::RequestRec'
]
],
'wrlock' => [
[
'APR::ThreadRWLock',
'APR::ThreadRWLock'
]
]
};
use base qw(Exporter);
our @EXPORT = qw(print_method print_module print_object);
our $VERSION = $mod_perl2::VERSION;
use constant MODULE => 0;
use constant OBJECT => 1;
my $modules;
my $objects;
sub _get_modules {
for my $method (sort keys %$methods) {
for my $item ( @{ $methods->{$method} }) {
push @{ $modules->{$item->[MODULE]} }, [$method, $item->[OBJECT]];
}
}
}
sub _get_objects {
for my $method (sort keys %$methods) {
for my $item ( @{ $methods->{$method} }) {
next unless defined $item->[OBJECT];
push @{ $objects->{$item->[OBJECT]} }, [$method, $item->[MODULE]];
}
}
}
# if there is only one replacement method in 2.0 API we can
# automatically lookup it, up however if there are more than one
# (e.g. new()), we need to use a fully qualified value here
# of course the same if the package is not a mod_perl one.
#
# the first field represents the replacement method or undef if none
# exists, the second field is for extra comments (e.g. when there is
# no replacement method)
my $methods_compat = {
# Apache2::
gensym => ['Symbol::gensym',
'or use "open my $fh, $file"'],
module => ['Apache2::Module::loaded',
''],
define => ['exists_config_define',
''],
httpd_conf => ['add_config',
''],
SERVER_VERSION => ['get_server_version',
''],
can_stack_handlers=> [undef,
'there is no more need for that method in mp2'],
# Apache2::RequestRec
soft_timeout => [undef,
'there is no more need for that method in mp2'],
hard_timeout => [undef,
'there is no more need for that method in mp2'],
kill_timeout => [undef,
'there is no more need for that method in mp2'],
reset_timeout => [undef,
'there is no more need for that method in mp2'],
cleanup_for_exec => [undef,
'there is no more need for that method in mp2'],
send_http_header => ['content_type',
''],
header_in => ['headers_in',
'this method works in mod_perl 1.0 too'],
header_out => ['headers_out',
'this method works in mod_perl 1.0 too'],
err_header_out => ['err_headers_out',
'this method works in mod_perl 1.0 too'],
register_cleanup => ['cleanup_register',
''],
post_connection => ['cleanup_register',
''],
content => [undef, # XXX: Apache2::Request::what?
'use CGI.pm or Apache2::Request instead'],
clear_rgy_endav => ['special_list_clear',
''],
stash_rgy_endav => [undef,
''],
run_rgy_endav => ['special_list_call',
'this method is no longer needed'],
seqno => [undef,
'internal to mod_perl 1.0'],
chdir_file => [undef, # XXX: to be resolved
'temporary unavailable till the issue with chdir' .
' in the threaded env is resolved'],
log_reason => ['log_error',
'not in the Apache 2.0 API'],
READLINE => [undef, # XXX: to be resolved
''],
send_fd_length => [undef,
'not in the Apache 2.0 API'],
send_fd => ['sendfile',
'requires an offset argument'],
is_main => ['main',
'not in the Apache 2.0 API'],
cgi_var => ['subprocess_env',
'subprocess_env can be used with mod_perl 1.0'],
cgi_env => ['subprocess_env',
'subprocess_env can be used with mod_perl 1.0'],
each_byterange => [undef,
'now handled internally by ap_byterange_filter'],
set_byterange => [undef,
'now handled internally by ap_byterange_filter'],
# Apache::File
open => [undef,
''],
close => [undef, # XXX: also defined in APR::Socket
''],
tmpfile => [undef,
'not in the Apache 2.0 API, ' .
'use File::Temp instead'],
# Apache::Util
size_string => ['format_size',
''],
escape_uri => ['unescape_path',
''],
escape_url => ['escape_path',
'and requires a pool object'],
unescape_uri => ['unescape_url',
''],
unescape_url_info => [undef,
'use CGI::Util::unescape() instead'],
escape_html => [undef, # XXX: will be ap_escape_html
'ap_escape_html now requires a pool object'],
parsedate => ['parse_http',
''],
validate_password => ['password_validate',
''],
# Apache::Table
#new => ['make',
# ''], # XXX: there are other 'new' methods
# Apache::Connection
auth_type => ['ap_auth_type',
'now resides in the request object'],
};
sub avail_methods_compat {
return keys %$methods_compat;
}
sub avail_methods {
return keys %$methods;
}
sub avail_modules {
my %modules = ();
for my $method (keys %$methods) {
for my $item ( @{ $methods->{$method} }) {
$modules{$item->[MODULE]}++;
}
}
return keys %modules;
}
sub preload_all_modules {
_get_modules() unless $modules;
eval "require $_" for sort keys %$modules;
}
sub _print_func {
my $func = shift;
my @args = @_ ? @_ : @ARGV;
no strict 'refs';
print( ($func->($_))[0]) for @args;
}
sub print_module { _print_func('lookup_module', @_) }
sub print_object { _print_func('lookup_object', @_) }
sub print_method {
my @args = @_ ? @_ : @ARGV;
while (@args) {
my $method = shift @args;
my $object = (@args &&
(ref($args[0]) || $args[0] =~ /^(Apache2|ModPerl|APR)/))
? shift @args
: undef;
print( (lookup_method($method, $object))[0]);
}
}
sub sep { return '-' x (shift() + 20) . "\n" }
# what modules contain the passed method.
# an optional object or a reference to it can be passed to help
# resolve situations where there is more than one module containing
# the same method. Inheritance is supported.
sub lookup_method {
my ($method, $object) = @_;
unless (defined $method) {
my $hint = "No 'method' argument was passed\n";
return ($hint);
}
# strip the package name for the fully qualified method
$method =~ s/.+:://;
if (exists $methods_compat->{$method}) {
my ($replacement, $comment) = @{$methods_compat->{$method}};
my $hint = "'$method' is not a part of the mod_perl 2.0 API\n";
$comment = length $comment ? " $comment\n" : "";
# some removed methods have no replacement
return $hint . "$comment" unless defined $replacement;
$hint .= "use '$replacement' instead. $comment";
# if fully qualified don't look up its container
return $hint if $replacement =~ /::/;
my ($modules_hint, @modules) = lookup_method($replacement, $object);
return $hint . $modules_hint;
}
elsif (!exists $methods->{$method}) {
my $hint = "Don't know anything about method '$method'\n";
return ($hint);
}
my @items = @{ $methods->{$method} };
if (@items == 1) {
my $module = $items[0]->[MODULE];
my $hint = "To use method '$method' add:\n" . "\tuse $module ();\n";
# we should really check that the method matches the object if
# any was passed, but it may not always work
return ($hint, $module);
}
else {
if (defined $object) {
my $class = ref $object || $object;
for my $item (@items) {
# real class or inheritance
if ($class eq $item->[OBJECT] or
(ref($object) && $object->isa($item->[OBJECT]))) {
my $module = $item->[MODULE];
my $hint = "To use method '$method' add:\n" .
"\tuse $module ();\n";
return ($hint, $module);
}
}
# fall-through
local $" = ", ";
my @modules = map $_->[MODULE], @items;
my $hint = "Several modules (@modules) contain method '$method' " .
"but none of them matches class '$class';\n";
return ($hint);
}
else {
my %modules = map { $_->[MODULE] => 1 } @items;
# remove dups if any (e.g. $s->add_input_filter and
# $r->add_input_filter are loaded by the same Apache2::Filter)
my @modules = sort keys %modules;
my $hint;
if (@modules == 1) {
$hint = "To use method '$method' add:\n\tuse $modules[0] ();\n";
return ($hint, $modules[0]);
}
else {
$hint = "There is more than one class with method '$method'\n" .
"try one of:\n" . join '', map {"\tuse $_ ();\n"} @modules;
return ($hint, @modules);
}
}
}
}
# what methods are contained in the passed module name
sub lookup_module {
my ($module) = shift;
unless (defined $module) {
my $hint = "no 'module' argument was passed\n";
return ($hint);
}
_get_modules() unless $modules;
unless (exists $modules->{$module}) {
my $hint = "don't know anything about module '$module'\n";
return ($hint);
}
my @methods;
my $max_len = 6;
for ( @{ $modules->{$module} } ) {
$max_len = length $_->[0] if length $_->[0] > $max_len;
push @methods, $_->[0];
}
my $format = "%-${max_len}s %s\n";
my $banner = sprintf($format, "Method", "Invoked on object type");
my $hint = join '',
("\nModule '$module' contains the following XS methods:\n\n",
$banner, sep(length($banner)),
map( { sprintf $format, $_->[0], $_->[1]||'???'}
@{ $modules->{$module} }),
sep(length($banner)));
return ($hint, @methods);
}
# what methods can be invoked on the passed object (or its reference)
sub lookup_object {
my ($object) = shift;
unless (defined $object) {
my $hint = "no 'object' argument was passed\n";
return ($hint);
}
_get_objects() unless $objects;
# a real object was passed?
$object = ref $object || $object;
unless (exists $objects->{$object}) {
my $hint = "don't know anything about objects of type '$object'\n";
return ($hint);
}
my @methods;
my $max_len = 6;
for ( @{ $objects->{$object} } ) {
$max_len = length $_->[0] if length $_->[0] > $max_len;
push @methods, $_->[0];
}
my $format = "%-${max_len}s %s\n";
my $banner = sprintf($format, "Method", "Module");
my $hint = join '',
("\nObjects of type '$object' can invoke the following XS methods:\n\n",
$banner, sep(length($banner)),
map({ sprintf $format, $_->[0], $_->[1]} @{ $objects->{$object} }),
sep(length($banner)));
return ($hint, @methods);
}
1;