1 package SL::DB::Object;
 
   7 use List::MoreUtils qw(any);
 
  10 use SL::DB::Helper::Attr;
 
  11 use SL::DB::Helper::Metadata;
 
  12 use SL::DB::Helper::Manager;
 
  14 use base qw(Rose::DB::Object);
 
  18   my $self  = $class->SUPER::new();
 
  20   $self->_assign_attributes(@_) if $self;
 
  26   my $class_or_self = shift;
 
  27   my $class         = ref($class_or_self) || $class_or_self;
 
  28   my $type          = $class =~ m/::Auth/ ? 'LXOFFICE_AUTH' : 'LXOFFICE';
 
  30   return SL::DB::create(undef, $type);
 
  34   return 'SL::DB::Helper::Metadata';
 
  37 sub _get_manager_class {
 
  38   my $class_or_self = shift;
 
  39   my $class         = ref($class_or_self) || $class_or_self;
 
  41   return $class->meta->convention_manager->auto_manager_class_name($class);
 
  44 Readonly my %text_column_types => (text => 1, char => 1, varchar => 1);
 
  46 sub assign_attributes {
 
  50   my $pk         = ref($self)->meta->primary_key;
 
  51   delete @attributes{$pk->column_names} if $pk;
 
  53   return $self->_assign_attributes(%attributes);
 
  56 sub _assign_attributes {
 
  60   my %types      = map { $_->name => $_->type } ref($self)->meta->columns;
 
  62   while (my ($attribute, $value) = each %attributes) {
 
  63     my $type = lc($types{$attribute} || 'text');
 
  64     $value   = $type eq 'boolean'                ? ($value ? 't' : 'f')
 
  65              : $text_column_types{$type}         ? $value
 
  66              : defined($value) && ($value eq '') ? undef
 
  68     $self->$attribute($value);
 
  74 sub update_attributes {
 
  77   $self->assign_attributes(@_)->save;
 
  85   return $self->$sub(@_);
 
  96 SL::DB::Object: Base class for all of our model classes
 
 100 This is the base class from which all other model classes are
 
 101 derived. It contains functionality and settings required for all model
 
 104 Several functions (e.g. C<make_manager_class>, C<init_db>) in this
 
 105 class are used for setting up the classes / base classes used for all
 
 106 model instances. They overwrite the functions from
 
 113 =item assign_attributes %attributes
 
 115 =item _assign_attributes %attributes
 
 117 Assigns all elements from C<%attributes> to the columns by calling
 
 118 their setter functions. The difference between the two functions is
 
 119 that C<assign_attributes> protects primary key columns while
 
 120 C<_assign_attributes> doesn't.
 
 122 Both functions handle values that are empty strings by replacing them
 
 123 with C<undef> for non-text columns. This allows the calling functions
 
 124 to use data from HTML forms as the input for C<assign_attributes>
 
 125 without having to remove empty strings themselves (think of
 
 126 e.g. select boxes with an empty option which should be turned into
 
 127 C<NULL> in the database).
 
 129 =item update_attributes %attributes
 
 131 Assigns the attributes from C<%attributes> by calling the
 
 132 C<assign_attributes> function and saves the object afterwards. Returns
 
 135 =item _get_manager_class
 
 137 Returns the manager package for the object or class that it is called
 
 138 on. Can be used from methods in this package for getting the actual
 
 141 =item C<call_sub $name, @args>
 
 143 Calls the sub C<$name> on C<$self> with the arguments C<@args> and
 
 144 returns its result. This is meant for situations in which the sub's
 
 145 name is a composite, e.g.
 
 147   my $chart_id = $buchungsgruppe->call_sub(($is_sales ? "income" : "expense") . "_accno_id_${taxzone_id}");
 
 153 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>