Do you want all the attributes of the object that are set; or all the attributes of the class that have been declared?
Example:
package Foo {
use Moo;
has a => (is => "ro");
has b => (is => "ro");
}
my $bar = Foo->new(a => 42);
Do you want just "a", or do you want "a" and "b"?
If you want just "a" - that is, the list of attributes that have been set for a particular object - then unless you've been playing around subclassing Method::Generate::Accessor, you ought to be able to use keys(%$bar).
If you want "a" and "b" - that is, the list of all attributes declared for the class - then you could try:
keys(%{
'Moo'->_constructor_maker_for('Foo')->all_attribute_specs
})
... which IIRC respects inheritance and role composition.
package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
|