ARCv2
view release on metacpan or search on metacpan
scripts/object.pl view on Meta::CPAN
foreach (@files) {
open (FH,"<$_");
my $name;
my $doc = { in => "", out => "", desc => ""};
while (<FH>) {
if (/package\s+(.*?);/) {
$name = $1;
$methods{$name} = {};
$members{$name} = {};
} elsif (/ISA.+qw\((.*?)\)/) {
$iter{$name} = $1;
} elsif (/^sub\s+(\w+)/) {
if ($1 =~ m/members/) {
while (<FH>) {
my $m = $_;
if ($m =~ /\s+(\w+)\s+=>\s+(.*?),/) {
my $n = $1;
$members{$name}->{access_level($n)}->{$n}->{value} = $2;
if ($m =~ /#(\s*)(.*)$/) {
$members{$name}->{access_level($n)}->{$n}->{desc} = $2;
}
}
last if (/\};/);
}
} else {
$methods{$name}->{access_level($1)}->{$1}->{doc} = $doc;
}
$doc = { desc => ""};
} elsif (/^##(\s*)(.*)$/) {
my $t = $2;
if ($t =~ /^in>\s+(.*)/) {
$doc->{in} .= $1;
} elsif ($t =~ /^out>\s+(.*)/) {
$doc->{out} .= $1."\n";
} elsif ($t =~ /^eg>\s+(.*)/) {
$doc->{eg} .= $1."\n";
} else {
$doc->{desc} .= $t."\n";
}
}
}
close(FH);
}
die "Given class not found, cannot build object structure. ($base)" if (!$members{$base} && !$methods{$base});
podout("head1","Class VARIABLES");
my %ready;
showclass_members($base,0,0,"public");
showclass_members($base,0,0,"protected");
showclass_members($base,0,0,"private");
%ready = ();
podout("head1","Class METHODS");
showclass_methods($base,0,0,"public");
showclass_methods($base,0,0,"protected");
showclass_methods($base,0,0,"private");
print "\n";
sub access_level
{
$_ = $_[0];
if (/^__/) {
return "private";
} elsif (/^_/) {
return "protected";
} else {
return "public";
}
}
sub issuperior
{
my ($type,$cname,$item,$acl) = @_;
my $text = "";
while ($cname = $iter{$cname}) {
if (eval '$'.$type.'{$cname}->{$acl}->{$item}') {
$ready{$item} = 1;
$text = "reimplemented from $cname";
last;
}
}
return $text;
}
sub showmembers
{
my $inh = shift;
my $cname = shift;
my $aclevel = shift;
my %ac = @_;
%ac = %{$ac{$aclevel}};
foreach (sort { uc($a) cmp uc($b) } keys %ac) {
# superior classes maybe have this method, we want to know which one
next if $ready{$_};
my $inherited = issuperior("members",$cname,$_,$aclevel);
$inherited |= $inh;
if ($inherited ne "") {
$inherited = "I<".$inherited.">";
} else {
$inherited = "";
}
podout("item",$_," ",$inherited);
if ($ac{$_}->{desc}) {
textout("B<Description>: ",$ac{$_}->{desc});
}
if ($ac{$_}->{value}) {
textout("B<Default value>: ",$ac{$_}->{value});
}
}
}
sub showmethods
{
my $inh = shift;
my $cname = shift;
my $aclevel = shift;
my %ac = @_;
%ac = %{$ac{$aclevel}};
foreach (sort { uc($a) cmp uc($b) } keys %ac) {
# superior classes maybe have this method, we want to know which one
next if $ready{$_};
my $inherited = issuperior("methods",$cname,$_,$aclevel);
$inherited |= $inh;
if ($inherited ne "") {
$inherited = "I<".$inherited.">";
} else {
$inherited = "";
}
podout("item","$_ ( ",$ac{$_}->{doc}->{in} ? $ac{$_}->{doc}->{in} : "" ," ) ",$inherited);
if ($ac{$_}->{doc}->{desc}) {
textout("B<Description>: ",$ac{$_}->{doc}->{desc});
}
if ($ac{$_}->{doc}->{out}) {
textout("B<Returns:> ",$ac{$_}->{doc}->{out});
}
if ($ac{$_}->{doc}->{eg}) {
textout("B<Example:>");
textout($ac{$_}->{doc}->{eg});
}
}
}
sub showclass_methods
{
my ($name,$inl,$inh,$acc) = @_;
podout("head3",uc("$acc methods")) unless $inh;
if ($methods{$name}->{$acc}) {
podout("over",2);
showmethods($inh ? "inherited from ".$name : "" ,$name,$acc,%{$methods{$name}});
podout("back");
}
if ($acc ne "private" && $iter{$name} ) {
foreach (split(/\s+/,$iter{$name})) {
showclass_methods($_,$inl+1,1,$acc);
}
}
}
sub showclass_members
{
my ($name,$inl,$inh,$acc) = @_;
podout("head3",uc("$acc members")) unless $inh;
if ($members{$name}->{$acc}) {
podout("over",2);
showmembers($inh ? "inherited from ".$name : "",$name,$acc,%{$members{$name}});
podout("back");
}
if ($acc ne "private" && $iter{$name} ) {
foreach (split(/\s+/,$iter{$name})) {
showclass_members($_,$inl+1,1,$acc);
}
}
}
sub podout
{
my $h = shift;
print "\n=",$h," ",@_ ? join("",@_):"","\n";
}
sub textout
{
print "\n",@_,"\n";
}
sub verbout
{
# if ($args{v})
# print STDERR join(" ",@_),"\n";
}
( run in 0.983 second using v1.01-cache-2.11-cpan-39bf76dae61 )