我正在处理一个明显的简单问题.
我正在写一个类似于UML::Class::Simple的模块,但有一些改进.总而言之,我们的想法是为给定源中的每个模块检索记录卡,其中包含有关方法,属性,依赖关系和子项的信息.我目前的问题是获取每个模块的方法和属性.让我们看看我已经写过的代码:
use Class::Inspector; use Data::Dumper; sub _load_methods{ my $pkg = shift; my $methods = Class::Inspector->methods( $pkg,'expanded' ); print Dumper $methods; return 1; }
为给定的包调用此函数,我得到的方法比我预期的多.原因是Class::Inspector返回所有继承的方法,如果模块是Moose :: Object,则返回访问器.我想过滤所有这些方法,以获得在给定包中定义的方法,而不是在其父类中.
任何人都可以提供一种优雅的方式来按我建议的方式过滤方法列表吗?
提前致谢.
解决方法
如果类是Moose类,请不要使用Class :: Inspector进行检查. Moose提供了自己非常广泛的内省API.它可以为您提供方法,属性等的列表.
my $Meta = Moose::Util::find_Meta($class_name); my @isa = $Meta->superclasses; my @does = $Meta->calculate_all_roles; my @can = $Meta->get_method_list; my @has = $Meta->get_attribute_list;
所有这些的文档遗憾地分为许多不同的页面. Moose::Meta::Class不是一个糟糕的起点.
鼠标提供了一个几乎但不完全相同的内省API.
Moo不提供自己的内省API,但如果加载Moose将挂钩到Moose的API,以便您可以使用Moose :: Util :: find_Meta检索有关Moo类的信息.