ActiveRecord::Simple
====================

ActiveRecord::Simple - Simple to use lightweight implementation of ActiveRecord pattern.

It is fast, don't have any dependencies and realy easy to use.

The basic setup of your package should be:

   package Model::Foo;

   use base 'ActiveRecord::Simple';

   __PACKAGE__->table_name('foo');
   __PACKAGE__->columns('id', 'bar', 'baz');
   __PACKAGE__->primary_key('id');

   1;

And then, you can use your package in a program:

   use Foo;

   my $foo = Foo->new({ bar => 'value', baz => 'value' });
   $foo->save();

   # or
   my $foo = Foo->get(1);
   print $foo->bar;

   # or
   $foo->bar('new value')->save();

   print $foo->bar;

See pod documentation of the module for more information about using
ActiveRecord::Simple.

What we've got?
===============

Flexible search

   Person->find(1); # by ID
   Person->find([1, 2, 3]); # by several ID's
   Person->find({ name => 'Foo' }); # by parameters
   Person->find({ city => City->find({name => 'Paris'})->fetch }); # parameters as an objects
   Person->find('name = ? OR lastname = ?', 'Foo', 'Bar'); # by condition

   Person->last;  # last object in the database
   Person->first; # first object

Easy fetch

   # Just one object:
   my $bill = Person->find({ name => 'Bill' })->fetch;

   # Only 3 objects:
   my @list = Person->find('age > ?', 21)->fetch(3);

   # All objects:
   my @list = Person->find->fetch;

   # Even more:
   while (my $person = Person->find->fetch) {
       print $person->name, "\n";
   }

Simple ordering:

   Person->find->order_by('name');
   Person->find->order_by('name', 'last_name');
   Person->find->order_by('name')->desc;

Limit, Offset:

   Person->find->limit(3);
   Person->find->offset(10);
   Person->find->limit(3)->offset(12);

Left joins:

   my $person = Person->find->with('misc_info')->fetch;
   print $person->name;
   print $person->misc_info->zip;

And, of course, all of this together:

   my $new_customer =
       Person->find
             ->only('name')
             ->order_by('date_register')
             ->desc
             ->limit(1)
             ->with('misc_info', 'payment_info')
             ->fetch;

   print $new_customer->name;
   print $new_customer->misc_info->zip;
   print $new_customer->payment_info->last_payment;

Also one-to-one, one-to-many, many-to-one and many-to-many relations, smart_saving and even more.

And, of course, you don't need use "table_name", "primary_key" etc. Just use this:

   __PACKAGE__->load_info(); ### All info will be loaded from database automatically.

Check it out!


INSTALLATION
============

To install this module, run the following commands:

   $ perl Makefile.PL
   $ make
   $ make test
   $ make install

or:

   $ sudo cpan ActiveRecord::Simple

SUPPORT AND DOCUMENTATION
=========================

After installing, you can find documentation for this module with the
perldoc command.

   perldoc ActiveRecord::Simple

Feel free to join us at google groups:
https://groups.google.com/forum/#!forum/activerecord-simple

Also the github page:
http://shootnix.github.io/activerecord-simple/

LICENSE AND COPYRIGHT
=====================

Copyright (C) 2013-2018 shootnix

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.

CREDITS
=======

@shootnix
@kberov
@chorny
@lifeofguenter
@neilbowers
@dsteinbrunner
@reindeer
@grinya007