package Maypole::Model::Base;
+use strict;
use Maypole::Constants;
use attributes ();
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 ) = @_;
return if $r->{template}; # Authentication has set this, we're done.
$r->{template} = $method;
- $r->objects([ $class->fetch_objects($r) ]);
+ my $obj = $class->fetch_objects($r);
+ $r->objects([$obj]) if $obj;
$class->$method( $r, $obj, @{ $r->{args} } );
}
} $class->columns;
}
-=head2 description
+=head2 is_public
-A description of the class to be passed to the template.
+should return true if a certain action is supported, or false otherwise.
+Defaults to checking if the sub has the C<:Exported> attribute.
=cut
-sub description { "A poorly defined class" }
+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 is_public
+=head2 method_attrs
-should return true if a certain action is supported, or false otherwise.
-Defaults to checking if the sub has the C<:Exported> attribute.
+Returns the list of attributes defined for a method. Maypole itself only
+defines the C<Exported> attribute.
=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 method_attrs
+{
+ my ($class, $method) = @_;
+
+ my $cv = $class->can($method);
+
+ return unless $cv;
+
+ my @attrs = attributes::get($cv);
+
+ return @attrs;
}
=head2 related