Paul Makepeace wrote:
One aspect, that befalls any abstraction system, is that you run into a situation where a lot of work is being hidden behind a simple interface.
True, although this is something that can be easily mitigated with a bespoke object method or two and an orcish manoeuvre. package My::User; use base 'My::Database::Record'; sub roles { my $self = shift; return $self->{ roles } ||= { map { $_->role => $_ } $self->model->roles->fetch( user_id => $self->{ id } ) }; } sub has_role { my ($self, $role) = @_; return $self->roles->{ $role }; } These kind of methods can be auto-generated quite easily. Nevertheless, it does require someone to think about these kind of issues and design the system accordingly. A