our %remember;
-sub MODIFY_CODE_ATTRIBUTES { $remember{ $_[1] } = $_[2]; () }
+sub MODIFY_CODE_ATTRIBUTES
+{
+ shift; # class name not used
+ my ($coderef, @attrs) = @_;
+
+ $remember{$coderef} = \@attrs;
+
+ # previous version took care to return an empty array, not sure why,
+ # but shall cargo cult it until know better
+ return;
+}
-sub FETCH_CODE_ATTRIBUTES { $remember{ $_[1] } || () }
+sub FETCH_CODE_ATTRIBUTES { @{ $remember{$_[1]} || [] } }
sub process {
my ( $class, $r ) = @_;
=cut
-sub is_public {
- my ( $self, $action ) = @_;
- my $cv = $self->can($action);
- return 0 unless $cv;
- my $attrs = join " ", (attributes::get($cv) || ());
- do {
- warn "$action not exported" if Maypole->debug;
- return 0;
- } unless $attrs =~ /\bExported\b/i;
- return 1;
+sub is_public
+{
+ my ($self, $action) = @_;
+
+ my %attrs = map {$_ => 1} $self->method_attrs($action);
+
+ return 1 if $attrs{Exported};
+
+ warn "$action not exported" if Maypole->debug;
+
+ return 0;
+}
+
+=head2 method_attrs
+
+Returns the list of attributes defined for a method. Maypole itself only
+defines the C<Exported> attribute.
+
+=cut
+
+sub method_attrs
+{
+ my ($class, $method) = @_;
+
+ my $cv = $class->can($method);
+
+ return unless $cv;
+
+ my @attrs = attributes::get($cv);
+
+ return @attrs;
}
=head2 related