Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cside/sub-inspector
get infomation from coderef
https://github.com/cside/sub-inspector
Last synced: 26 days ago
JSON representation
get infomation from coderef
- Host: GitHub
- URL: https://github.com/cside/sub-inspector
- Owner: Cside
- Created: 2012-05-05T01:15:07.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2013-06-05T12:22:51.000Z (over 11 years ago)
- Last Synced: 2024-10-28T16:34:06.199Z (2 months ago)
- Language: Perl
- Size: 113 KB
- Stars: 0
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.pod
- Changelog: Changes
Awesome Lists containing this project
README
package Sub::Inspector;
use 5.008_001;
use strict;
use warnings;
use B ();
use Carp ();
our @CARP_NOT;
use attributes;
use Data::Dumper;our $VERSION = 'Y';
sub new {
my ($class, $code) = @_;
_throw($code) unless ref($code) eq 'CODE';
bless +{ code => $code }, $class;
}sub file { B::svref_2object(_code(@_))->GV->FILE }
sub line { B::svref_2object(_code(@_))->GV->LINE }
sub name { B::svref_2object(_code(@_))->GV->NAME }sub proto { B::svref_2object(_code(@_))->PV }
sub prototype { proto(@_) }sub attrs { attributes::get(_code(@_)) }
sub attributes { attrs(@_) }sub _throw {
local $Data::Dumper::Indent = 1;
local $Data::Dumper::Terse = 1;
local @CARP_NOT = (__PACKAGE__);
Carp::croak "argument isn't a subroutine reference: " . Dumper($_[0]);
}sub _code {
my ($stuff, $arg) = @_;
# instance method
if (ref($stuff) eq __PACKAGE__) {
return $stuff->{code};
# calss method
} elsif (defined($stuff) && $stuff eq __PACKAGE__) {
return $arg if (ref($arg) eq 'CODE');
_throw($arg);
}
}1;
__END__=head1 NAME
Sub::Inspector - get infomation (prototype, attributes, name, etc) from a subroutine reference
=head1 SYNOPSIS
use Sub::Inspector;
# get file, line, name (oo interface)
use File::Spec;
my $code = File::Spec->can('canonpath');
my $inspector = Sub::Inspector->new($code);print $inspector->file; #=> '/Users/Cside/perl5/ ... /File/Spec/Unix.pm'
print $inspector->line; #=> 71
print $inspector->name; #=> 'canonpath'# class method interface
print Sub::Inspector->file($code); #=> '/Users/Cside/perl5/ ... /File/Spec/Unix.pm'
print Sub::Inspector->line($code); #=> 71
print Sub::Inspector->name($code); #=> 'canonpath'# get prototype
use Try::Tiny qw(try);
print Sub::Inspector->proto(\&try); #=> '&;@'
# get attributes
use AnyEvent::Handle;
my $code2 = AnyEvent::Handle->can('rbuf');print Sub::Inspector->attrs($code2); #=> ('lvalue')
=head1 DESCRIPTION
This module enable to get metadata (prototype, attributes, method name, etc) from a coderef.
We can get them by the buit-in module, B.pm. However, it is a bit difficult to memorize how to use it.=head1 Functions
NOTE: You can call each method whether as instance method or as class method.
=over
=item $inspector->file
=item $inspector->line
=item $inspector->name
=item $inspector->proto
alias: prototype
=item $inspector->attrs
alias: attributes
=back
=head1 SEE ALSO
=over
=item L
=item L
=back
=head1 AUTHOR
Hiroki Honda (Cside) Ecside.story [at] gmail.comE
=head1 LICENSE AND COPYRIGHT
Copyright (c) Hiroki Honda.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.=cut