NAME

Simo::Manual - Manual for Simo

CAUTION

This article is under construction. please wait.

What is Simo?

Simo simplify Object Oriented Programing.

Simo is more useful than Class::Accessor.

Simo is more simple than Moose or Mouse.

You do not learn many syntax to do Object Oriented Programing.

Let't enjoy!

FEATURES

1. Can create accessors very simple way.
2. new method is prepared.
3. Can arrange accessor.( defalt value, constarant value or etc )
4. Can catch error object and get many information of error.

1. Install of Simo

1-1. Install of Simo

You can install Simo the following way.

cpan Simo

If you install Simo into Windows. You have to install nmake program.

1-2. Relative module of Simo

Simo have some relative module.

1. Simo::Error - create error object to get many information of error
2. Simo::Util - provide useful functions to manipulate of object
3. Simo::Constrain - constrain value when value is set through accessor

2. Class creating

2-1. Class creating and definition of accessor

You can define accessor very simple way.

package Book;
use Simo;

sub title{ ac }
sub author{ ac }
sub price{ ac }

Book class has three accessors( title, author, price ).

All you do to define accessor is calling ac function.

new method is automatically prepared.

and use strict; use warnings;

is import into your class.

2-2. Creating object

You can create object in normal way.

You can pass hash or hash ref to new method

use Book;

my $book = Book->new( title => 'Goog new', author => 'Kimoto', price => 2000 );

or

my $book = Book->new( { title => 'Goog new', author => 'Kimoto', price => 2000 } );

3. �A�N�Z�b�T�̃I�v�V����

3-1. �t�B�[���h�̃f�t�H���g�l default

�t�B�[���h�̃f�t�H���g�l�̐ݒ�͈ȉ��̂悤�ɍs���܂��B

package Book;
use Simo;

sub title{ ac default => 'Good news' }
sub author{ ac default => [ 'Kimoto', 'Kishimoto' ] }
sub price{ ac default => { low => 1500, normal => 2000 } }

�t�B�[���h�ɒl���ݒ肳��Ă��Ȃ��Ƃ��ɃA�N�Z�b�T��Ăяo���� default �Ŏw�肳�ꂽ�l���g�p����܂��B

�擾�����l�́Adefault�Ŏw�肳�ꂽ�l���R�s�[�ł��B �f�t�H���g�l�����t�@�����X�Ȃǂ́u���l�╶����v�ȊO�̂�̂ł�����ꍇ�́AStorable��clone�֐��ɂ��Ēl���R�s�[����܂��B ����́A�傫�ȃf�[�^�ł�����ꍇ�̓I�[�o�[�w�b�h�ɂȂ肦�܂��B

�f�t�H���g�l�����t�@�����X��I�u�W�F�N�g�ł�����ꍇ�́A default �ł͂Ȃ��Č�ʼn���� auto_build ��g�p���邱�Ƃ�l���ɓ��Ă��������B

3-2. �t�B�[���h�̍\�z auto_build

�Ƃ��ɁA���̃t�B�[���h�̒l�Ɋ�Â��āA�t�B�[���h��\�z�������ꍇ������܂��B ���Ƃ��΁A�t�B�[���h�ɐݒ肳�ꂽ�z�X�g������Net::FTP�I�u�W�F�N�g��\�z�������ꍇ�Ȃǂł��B

���̂悤�ȏꍇ�́Aauto_build ��g�p����ƕ֗��ł��B auto_build �I�v�V������w�肷��ƁA�A�N�Z�b�T���Ă΂ꂽ�Ƃ��� �r���_�[���\�b�h����I�ɌĂяo���Ă���܂��B

package YourApp;
use Simo;
use Net::FTP;

sub host{ default => 'some.host.name' }

sub net_ftp{ ac auto_build => 1 }

sub build_net_ftp{
    my $self = shift;
    $self->net_ftp( Net::FTP->new( $self->host ) );
}

�r���_�[���\�b�h�́Abuild_net_ftp �̂悤��

build_�A�N�Z�b�T��

�ɂ���K�v������܂��B

2��ڈڍs�̃t�B�[���h�ւ̃A�N�Z�X�́A�r���_�[���\�b�h�ɂ��Đݒ肳�ꂽ�l���g�p����܂��B

�܂�buildr_xxx�Ƃ������O��D�܂Ȃ��Ȃ�Aauto_build�I�v�V�����ɃT�u���[�`����w�肷�邱�Ƃ�ł��܂��B

sub net_ftp{ ac auto_build => \&create_net_ftp }
 
sub create_net_ftp{
    # ...
}

3-3-1. �t�B�[���h�̐��� constrain

�t�B�[���h�ɐ������������ꍇ������܂��B ���l������󂯓�ꂽ�������A���̃N���X�̃I�u�W�F�N�g������󂯓�ꂽ������肷��ꍇ�ł��B

���̂悤�ȏꍇ�́Aconstrain ��g�p���܂��B constarin �ɂ́A�D���Ȑ���֐���n�����Ƃ�ł��܂����A �ʏ�́ASimo::Constrain �ɐ���̂��߂̊֐����p�ӂ���Ă���̂ł����g���܂��B

package Book;
use Simo;
use Simo::Constrain qw( is_str is_int isa );

sub title{ ac constrain => \&is_str }

sub author{ ac constrain => sub{ isa 'Person' } }

sub price{ ac constrain => \&is_int }

title�ɐݒ�ł���̕����񂾂��Aauthor�ɐݒ�ł���̂�Person�N���X�̃I�u�W�F�N�g�����A price�ɐݒ�ł���̂͐����l�����Ƃ�����悤�ɁA�t�B�[���h�ɐݒ�ł���l������ł��܂��B

������Ɉᔽ����΁A��O���������v���O�����͏I�����܂��B �ȉ��̂悤�ȃ��b�Z�[�W���\������܂��B

Book::price must be integer.( this value is bad ) at b.pl line 6

3-3-2. ����ᔽ�ɂɑ΂����O����

Simo�̓t�B�[���h�ɐ���ᔽ���N������Ƃ��ɗ�O�𓊂��܂��B ���̗�O�͒P�Ȃ镶����ł͂Ȃ��āASimo::Error�I�u�W�F�N�g�ł��B

���̃I�u�W�F�N�g�́A����ᔽ��N�������t�B�[���h���A�ݒ肳�ꂽ�l�Ȃǂ̏����Ă��܂��B

���̃I�u�W�F�N�g�̏�������Ƃ��́ASimo::Util �� err �֐���g�p���܂��B

�ȉ��̗�ł́Aprice�ɐ����ȊO��n�����̂ŗ�O���������܂��B ���̗�O��eval�ŃL���b�`������Aerr �֐��œ�e��擾���邱�Ƃ��ł��܂��B

use Book;
use Simo::Util qw( err );

my $book = eval{ Book->new( price => 'string', title => 'Good news' ) };

if( my $err = err ){
    my $type = $err->type;  # ��O�̎��
    my $msg = $err->msg;    # ��O���b�Z�[�W
    my $pos = $err->pos;    # ��O���N������ꏊ
    my $pkg = $err->pkg;    # ��O���N������p�b�P�[�W��
    my $attr = $err->attr   # ��O��N�������t�B�[���h��
    my $val = $err->val;    # ��O�̌���ɂȂ���l
    
    if( $attr eq 'price' ){
        # ��肽���G���[������s���B
    }
    else( $attr eq 'title' ){
        # ...
    }
    else{
        # ...
    }
}

�ǂ̃t�B�[���h���Ő���ᔽ���N����āA���ꂪ�ǂ̂悤�Ȓl�Ȃ̂���擾�ł��邽�� �ڍׂȃG���[������s�����Ƃ��ł��܂��B

�G���[�I�u�W�F�N�g�ɂ‚��Ă� Simo::Error ��Q�Ƃ��Ă��������B

3-3-3 �Ǝ��̐���֐��̎��

���Ǝ��ɐ���֐������������Ȃ�Ή”\�ł��B Simo�̐���֐��Ɠ����쐬��@�ŁA����֐���쐬����Δ��ɒ��a�̎�ꂽ��̂ɂȂ�܂��B

Simo::Constrain��is_define�֐��̎�����Ƃ��Čf�ڂ��Ă����܂��B

sub is_defined(;$){
    my $val = shift || $_;
    defined($val) or $@ = "must be defined.( undef is bad )", return 0;
    return 1;
}

����֐��́A������΂����g�p���A�Ȃ���΃f�t�H���g�ϐ� $_ ��g�p����悤�ɂ��܂��B ���̂悤�ɋL�q����΁A

sub title{ ac constrain => sub{ is_defined } }

�̂悤�Ɉ��ȗ������L�q���”\�ɂȂ�܂��B

����𖞂����Ȃ�����ꍇ�́A$@ �Ƀ��b�Z�[�W��ݒ肵�āA�U�l��ԋp���Ă��������B ���̃��b�Z�[�W�̓G���[���b�Z�[�W�Ƃ��Ďg�p����܂��B

����𖞂������ꍇ�́A�^�l��ԋp���Ă��������B

3-3-4 �����̐����L�q�����@

�������̐����L�q�������ꍇ��2�‚̕�@������܂��B

�ЂƂ‚߂́A�����T�u���[�`���Ƃ��Ď�����邱�Ƃł��B �ȉ��̗��Book�N���X��Cloneable�N���X��p�����Ă��邱�Ƃ�ۏႷ���ł��B

sub title{ ac constain => sub{ isa Book && isa Cloneable } }

���ЂƂ‚́A�z��̃��t�@�����X�ɕ����̐���֐���n����@�ł��B

sub title{ ac constrain => [ \&is_xxx, \&is_yyy, \&is_zzz ] }

3-4-1. �t�B�[���h�l�̃t�B���^�[ filter

���A�ݒ肳���l�ɉ��炩�̏�����{�������̂Ȃ�filter��g�p���Ă��������B

�ȉ��̗�ł͐ݒ肳���l��啶���ɂ��܂��B

package Book;
use Simo;

sub title{ ac filter => sub{ uc } }

���ЂƂ–���̃X���b�V�����菜�������Ă����܂��B

package Book;
use Simo;

sub dir{ ac filter => \&remove_last_slash }

sub remove_last_slash{
    my $val = shift;
    $val =~ s#/$##;
    return $val;
}

�t�B���^�̂��߂̊֐�����ꍇ�́A�t�B���^��̒l��return�ŕԋp����悤�ɂ��Ă��������B

3-4-2 �����̒l�̃t�B���^

�t�B���^����Ɠ����悤�ɕ�����ׂ邱�Ƃ��ł��܂��B

sub title{ ac filter => [ \&filter_xxx, \&fitler_yyy, \&filter_zzz ] }

3-5-1 �l���ݒ肳�ꂽ�ꍇ�̃g���K trigger

�g���K�Ƃ�Simo�ł́A�l���ݒ肳�ꂽ�ꍇ�Ɏ�s����郁�\�b�h�̂��Ƃ���܂��B

���Ƃ��΁A����l�ɕύX���������A���炩�̏������s�������ꍇ�Ƀg���K�͕֗��ł��B

�ЂƂ‚̗�Ƃ��āAGUI�ł̃v���O���~���O�ŁA �F�̒l���ύX���ꂽ��ĕ`����֐���Ăяo�������ꍇ�Ȃǂ��������܂��B

package Button;
use Simo;

sub color{ ac trigger => \&paint }
sub paint{
    # �ĕ`��̏���
}

3-5-2 �����̃g���K

�g���K��A�����t�B���^�Ɠ����悤�ɕ����Ȃ�ׂ邱�Ƃ��ł��܂��B

sub coloer{ ac tirgger => [ \&trigger_xxx, \&trigger_yyy, \&trigger_zzz ]

3-6 �ǂݎ���p�̃A�N�Z�b�T read_only

�ǂݎ���p�̃A�N�Z�b�T��쐬����ɂ́Aread_only��g�p���܂��B

package Book;
use Simo;

sub title{ ac default => 'Good news', read_only => 1 }

�ǂݎ���p�̃A�N�Z�b�T�́A�l���ݒ肳��悤�Ƃ����Ƃ��ɁA��O�𔭐������܂��B

��ʓI�ɂ́Adefault �Ƒg�ݍ��킹�Ďg�p���܂��B

3-6 �n�b�V���Ƃ��Ẳ�߂������Bhash_force

Simo�ɂ́A�A�N�Z�b�T�ɐݒ肳���l�͕K���X�J���[�ł��B�܂��擾����ꍇ��K���X�J���[�ɂȂ�܂��B

�z���ݒ肷�邱�Ƃ�n�b�V����ݒ肷�邱�Ƃ͂ł��܂���B

�A�N�Z�b�T�ɔz�񂪓n���ꂽ�ꍇ�͂ǂ��Ȃ�ł��傤��?

my $book = Book->new;
$book->author( 'Kimoto', 'Kenta', 'Mori' );

���̂悤�ȏꍇ�́A�����I�ɔz��̃��t�@�����X�ւƕϊ�����܂��B

�‚܂�A�ݒ肳���i�K�ł́A

[ 'Kimoto', 'Kenta', 'Mori' ]

�ɂȂ�܂��B

���Ƃ�

$book->author( main => 'Kimoto', sub => 'Kenta' );

�̂悤�Ƀn�b�V����ݒ肷��悤�ɈӐ}���Ă����Ƃ��Ă�

{ main => 'Kimoto', sub => 'Kenta' }

�ł͂Ȃ�

[ 'main', 'Kimoto', 'sub', 'Kenta' ]

�̂悤�ɕϊ�����܂��B

�����Ńn�b�V���Ƃ��ĉ�߂��Ăق����ꍇ�͈ȉ��̂悤��hash_force��g�p���܂��B

package Book;
use Simo;

sub author{ ac hash_force => 1 }

4.�p��

4-1 �p�� base

Simo�Ōp����s���ɂ͈ȉ��̂悤�ɂ��܂��B Book�Ƃ����N���X��p�����āAMagazine�Ƃ����N���X��쐬�����ł��B

package Magazine;
use Simo( base => 'Book' );

base ���W���[����g���̂ł͂Ȃ����Ƃɒ��ӂ��Ă��������B ���I�ɂ�base ���W���[����Ă�ł���̂ł����A�p���̏�����ۏႷ�邽�߂ɂ��̋L�q��s��Ă��������B

4-2 �~�b�N�X�C�� mixin

Simo�͋L�@��Ń~�b�N�X�C����T�|�[�g���܂��B

�ȉ��̗�́AClass::Cloneable��<Class::Comparable> ��~�b�N�X�C��������ł��B

package Book;
use Simo( mixin => [ 'Class::Cloneable', 'Class::Comparable' ] );

Simo�̃~�b�N�X�C���́A�����ʂȂ��Ƃ͂��܂���BSimo�̃~�b�N�X�C���͒P�Ȃ鑽�d�p���ł��B

����ǂ�A�N���X������l�́A���d�p����Ӑ}������̂ł͂Ȃ��A�~�b�N�X�C����Ӑ}������̂� �Ƃ������Ƃ�`���邱�Ƃ��ł��܂��B

�‚܂�A�����̃N���X�̓R���X�g���N�^������A����������ׂ����\�b�h�����邩����Ȃ��Ƃ��� ���Ƃ�g�p�҂Ɋ��������邱�Ƃ��ł��܂��B

4-3 �I�[�o�[���C�h�”\�ȃR���X�g���N�^�̎�� new

�������x�Șb��ł��B�ǂݔ�΂��Ă��܂��܂���B

���������玞�ɃI�[�o�[���C�h�”\�ȃR���X�g���N�^�����������Ȃ�ꍇ�����邩����܂���B

���ꂪ�A�ǂ̂悤�ȏꍇ��z�肵�Ă��邩�Ƃ����΁ASimo�ō쐬����Ă��Ȃ��N���X��p���������ꍇ�ł��B

������܂��傤�BCGI::Application ��p�����ĐV�����N���X���肽���Ƃ��܂��B

use MyApp;
use Simo( base => 'CGI::Application' );

sub app_name{ ac }

���̂悤�ɃN���X��쐬�����ꍇ�A���ɂȂ�̂́Aapp_name�̏����ł��Ȃ��Ƃ������Ƃł��B

new�ɌĂ΂��R���X�g���N�^�́ACGI::Application�̂�̂ł���ASimo�̂�̂ł͂���܂���B

my $myapp = MyApp->new( app_name => 'YHA' );

�̂悤�ɋL�q���邱�Ƃ��ł��Ȃ��̂ł��B

������s���邽�߂ɂ́A�e�̃R���X�g���N�^���s���ăI�u�W�F�N�g�𐶐����Ă���A ���̃I�u�W�F�N�g��app_name������K�v������܂��B

CGI::Application�̃R���X�g���N�^�ł́ATMPL_PATH, PARAMS, QUERY ����邱�Ƃ��ł��܂��B Simo�̃R���X�g���N�^�ł́Aapp_name����邱�Ƃ��ł��܂��B

���̍��̂�s���͔̂��ɖʓ|�ł��BSimo�́A���̋�J��ł��邾����菜�����߂ɁA new_self_and_parent�Ƃ������\�b�h���Ă��܂��B

�e�̃R���X�g���N�^���s���Ȃ���ASimo�̃R���X�g���N�^���s����ɂ́A�ȉ��̂悤�ɂ��܂��B

package MyApp;
use Simo( base => 'CGI::Application' );

sub new{
    my $self = shift->new_self_and_parent( @_, [ 'TMPL_PATH', 'PARAMS', 'QUERY' ] );
    return $self;
}

new_self_and_parent �̑�2��ɂ́A�e�̃R���X�g���N�^�̏���p�����[�^��z��̃��t�@�����X�Ŏw�肵�܂��B

�����L�q����΁A

my $myapp = MyApp->new( app_name => 'YHA', TMPL_PATH => 'xxx', PARAMS => {} QUERY => CGI->new );

�̂悤�ɁA�e�̃R���X�g���N�^��Simo�̃R���X�g���N�^�𓯎��Ɏ�s���邱�Ƃ��”\�ł��B

�����āA���Ȃ��́ACGI::Application�p�̃R���X�g���N�^�Ƃ��āA�������֗��Ȃ�̂�񋟂ł��邩����܂���B

�����Ȃ�΁A�����R���X�g���N�^�݂̂̃N���X�ɂ��Č��܂��傤�B

package Simo::New::CGI::Application;

sub new{
    my $self = shift->new_self_and_parent( @_, [ 'TMPL_PATH', 'PARAMS', 'QUERY' ] );
    
    # �������֗��Ȃ��Ƃ�s���B
    
    return $self;
}

�����Ă��̂悤�ɂ��č쐬�����Ȃ�A

package MyApp;
use Simo( base => 'CGI::Application', new => 'Simo::New::CGI::Application' );

�Ƃ����ӂ���new���\�b�h��C���|�[�g���邱�Ƃ��ł��܂��B����͂���Ɍp���”\�ł���āA

package MyApp;
use Simo( base => 'CGI::Application', new => 'Simo::New::CGI::Application' );

sub new{
    my $self = shift->SUERP::new( @_ );
    
    # ���[�U���D���Ȃ��Ƃ��B
    
    return $self;
}

�̂悤�ɗ��p���邱�Ƃ��ł��܂��B

�����Ɠ���B

4-4 new��I�[�o�[���C�h����B

new�̃I�[�o�[���C�h�ɂ‚��ď����Ă����܂��B

Simo�ɂ��Ď����I�ɗp�ӂ��ꂽnew�́A�I�[�o�[���C�h���邱�Ƃ��ł��܂��B

����́AClass::Accessor�ɑ΂���傫�ȗ��_�ł��B

�܂��Anew��I�[�o�[���C�h���邱�Ƃ𐄏����Ȃ�Moose��Mouse�ɑ΂��Ă�傫�ȗ��_�ł��B

Perl�ŃI�u�W�F�N�g�w���w��ł����m����Simo�ł͎��R�ɗ��p���邱�Ƃ��ł��܂��B

new�̃I�[�o�[���C�h�̐��`�͈ȉ��̂悤�ɂȂ�܂��B

package Book;
use Simo;

sub new{
    my $self = shift->SUERP::new( @_ );
    
    # �D���Ȃ��Ƃ��B
    
    return $self;
}

5. ���̑��̋@�\

5-1 �K�v�s�Œ��ȃt�B�[���h

���Ƃ���title��author�����t�B�[���h���K�v�s�Œ��Ȃ�΂��������܂��B

REQUIRED_ATTRS�Ƃ������\�b�h��I�[�o�[���C�h���Ă��������B

package Book;
use Simo;

sub title{ ac }
sub author{ ac }

sub REQUIRED_ATTRS{ qw/title author/ }

���̂悤�ɋL�q����΁A

my $book = Book->new;

�̂悤�ȋL�q����Ƃ��ɁA��O�𓊂��Ă���܂��B

���̂Ƃ��̃G���[�̃^�C�v��

attr_required

�ɂȂ�܂��B

���z�Ƃ��ẮA sub title{ ac required => 1 } �Ƃ����L�q���������B

����ǂ�ASimo�̃A�N�Z�b�T�͕K���x���ŕ]������邽�߁A�R���X�g���N�^���Ăяo���ꂽ���_�ł́A ���ꂪ�A�K�v�s�Œ��Ȃ̂��ǂ����𔻒�ł��܂���B

���̂��߂ɁAREQUIRED_ATTRS ��I�[�o�[���C�h����Ƃ�������Ƃ�܂����B

�X�y�����O�̃~�X�ɔ��ɋC��‚��Ă�������( �e�ՂɊԈႦ�Ă��܂��܂��B)

5-2 �K�v�s�Œ��ȃt�B�[���h�ƌp���̖��

��L��Book�N���X��p������Magazine�Ƃ����N���X��쐬�����ꍇ�A�K�v�s�Œ��ȃt�B�[���h�̒�`�����@�����܂��B

�����Ŕ��ɊԈႢ�₷�����Ƃ�����܂��Btitle, auhtor, price ��3�‚̃t�B�[���h��K�v�s�Œ��ɂ��邽�߂ɁA

package Magazine;
use Simo( base => 'Book' );

sub price{ ac }

sub REQUIRED_ATTRS{ 'price' }

�Ə����Ă��܂�Ă͊ԈႢ�ł��B

REQUIRE_ATTRS�̓I�[�o�[���C�h����邽�߂ɁAprice�������K�v�s�Œ��ȃt�B�[���h�ɂȂ�Ă��܂��܂��B

���������́A

sub REQUIRED_ATTRS{ qw/title author price/ }

�Ə����K�v������܂��B

�ł����āA�ʓ|����ˁB

�����ŁASimo�͊ȈՂȋL�q��p�ӂ��Ă��܂��B

sub REQUIRED_ATTRS{ 'price', and_super }

and_super ���\�b�h��ĂԂƃX�[�p�[�N���X�̃��\�b�h���Ă΂�A 'title' �� 'author' ���ԋp����܂��B

6. �I�u�W�F�N�g��֗��ɑ��삷��

�����Simo�̋@�\�̈�ʂ�̉���I���܂����B

�����܂ł́A�N���X�̍���̉��ł����B

���Simo�ł́A�N���X���邾���ł͂Ȃ��A�I�u�W�F�N�g��g�����ɂ�z�������‚���ɂȂ�Ă��܂��B

6-1. �����̃t�B�[���h�ɒl��ݒ肷��B set_values

�����̃t�B�[���h�̒l��ݒ肷��ɂ͈ȉ��̂悤�ɂ��܂��B

use Simo::Util 'o';

my $book = Book->new;

$book->set_values( title => 'Good news', author => 'Kimoto' );

�ŁA�����̃t�B�[���h�ɒl��ݒ肷�邱�Ƃ��ł��܂��B

6-2. �����̃t�B�[���h����l����o���B get_values

�����̃t�B�[���h����l����o���ɂ͈ȉ��̂悤�ɂ��܂��B

my ( $title, $auhtor ) = $book->get_values( qw/title author/ );

�n�b�V���X���C�X�̂悤�Ɏg�p�ł��܂��B

6-3 �����̃t�[���h����l��n�b�V���̃��t�@�����X�Ƃ��Ď��o���B get_hash

�����̃t�B�[���h����l��n�b�V���̃��t�@�����X�Ƃ��Ď��o�����Ƃ��ł��܂��B

my $hash = $book->get_hash( qw/title author/ );

����ꂽ�n�b�V���̃��t�@�����X��

{
    title => 'xxx',
    author => 'yyy'
}

�̂悤�ɂȂ�܂��B

6-3. �I�u�W�F�N�g�̃R�s�[��쐬����B clone

�I�u�W�F�N�g�̃R�s�[��쐬����ɂ�

my $book_copy = $book->clone

�Ƃ��܂��B���I�ɂ́AStorable �� dclone�֐����g�p����Ă��܂��B

6-4. �I�u�W�F�N�g��V���A���C�Y�܂��̓f�V���A���C�Y����B freeze, thaw

�I�u�W�F�N�g��V���A���C�Y����ɂ́A

my $book_str = $book->freeze;

�ŃV���A���C�Y����ɂ́A

my $book = Simo->thaw( $book_str );

�Ƃ��܂��B

�V���A���C�Y�Ƃ����̂́A�I�u�W�F�N�g��ۑ��ł���悤�ɕ����񉻂�����̂ł��B

�f�V���A���C�Y�Ƃ����̂́A�����񂩂�I�u�W�F�N�g�ւ̕����̂��Ƃł��B

���I�ɂ́AStorable�� freeze�֐���thaw�֐���g�p���Ă��܂��B

6-5 �I�u�W�F�N�g�ɐݒ肳�ꂽ�l���L��ǂ�����m�F����B validate

�I�u�W�F�N�g�ɐݒ肳�ꂽ�l���L��ǂ�����m�F����ɂ́A

$book->validate(
    title => sub{ length $_ < 100 },
    price => sub{ $_ > 0 }
);

�Ƃ��܂��B

�L��ǂ�����m�F����֐����U��Ԃ����Ƃ��́A��O�𓊂��܂��B

���̂Ƃ����������O�́A Simo::Error �I�u�W�F�N�g�ɂȂ�܂��B

�G���[�̃^�C�v�́A

value_invalid

�ɂȂ�܂��B

eval�ň͂�ė�O��E���ɂ́ASimo::Util�� err �֐���g���܂��B

Simo::Util qw( o err );

eval{
    $book->validate(
        title => sub{ length $_ < 100 },
        price => sub{ $_ > 0 }
    );        
};

if( my $err = err ){
    if( $err->attr eq 'title' ){
        
    }
    elsif( $er->attr eq 'author' ){
        
    }
    esle{
        
    }
}

���̂悤��validate���\�b�h��err�֐���g�p����ƁA �t�B�[���h�̒l���ƂɃG���[��`�F�b�N���邱�Ƃ��ł��܂��B

6-6 new ���ē����ɁAvalidate����B new_and_validate

new �� validate �𓯎��ɍs����ƕ֗��ȏꍇ������܂��B

my $q; # �O������������l�B

my $book = Book->new_and_validate( 
    title => $q->{ title }, sub{ length $_ < 100 },
    author => $q->{ author }, sub{ $_ > 0 }
);

���̂悤�ɃI�u�W�F�N�g�𐶐������Ȃ���A�l�̗L��̃`�F�b�N�������ɂł��܂��B

��O��ߊl����eval��g�ݍ��킹�Ĉȉ��̂悤�ɏ����ƕ֗��ł��B

my $book = eval{
    Book->new_and_validate( 
        title => $q->{ title }, sub{ length $_ < 100 },
        author => $q->{ author }, sub{ $_ > 0 }
    )
};

���̃��\�b�h�͕K��3�g�ŋL�q����K�v������܂��B

�����݂������Ȃ��ꍇ�́A

my $book = Book->new_and_validate( 
    price => $q->{ price }, sub{ 1 }
);    

sub{ 1 } ��n���܂��B

�܂��A���̃��\�b�h�͂��ЂƂ‚̋L�@������܂��B�ӂ��‚̃n�b�V�����t�@�����X��n����@�ł��B

my $book = Book->new_and_validate(
    {
        title => $q->{ title },
        author => $q->{ author },
    },
    {
        title =>  sub{ $_ > 0 },
        author => sub{ length $_ < 100 }
    }
);

6-7 ���\�b�h��A������s����B run_methods

���\�b�h��A�����Ď�s����ɂ́Arun_methods ��g�p���܂��B

���Ƃ��΁A�f�[�^��I���悤�ȋL�@��ƒ��\�b�h�ɑ΂��ĘA���I�Ɏ�s����Ƃ��ɕ֗��ł��B

���̃`�F�[���̓��\�b�h�`�F�[����ӎ����č���܂����B

���\�b�h�`�F�[������֗��ȓ_�́A���\�b�h�̎�s���\��������Ă��邽�߂ɁA���̃f�[�^�ƘA�g���₷���_�ł��B

my $result = $book_list->run_methods(
    find => [ 'author' => 'kimoto' ],
    sort => [ 'price', 'desc' ],
    'get_result'
);

6-8 �����̃t�B�[���h�̒l��t�B���^����B filter_values

�����̃t�B�[���h�̒l��ʂ̒l�ɕϊ��������Ƃ��́Afilter_values��g�p���܂��B

$book->filter_valuse( sub{ uc }, qw/title, author/ );

���̂悤�ɋL�q����ƁAtitle �� author �̃t�B�[���h�̒l���啶���ɕϊ�����܂��B

���̃��\�b�h�̂��ЂƂ‚̓���Ƃ��āA�t�B�[���h�̒l���z�񂾂���ꍇ�͂��̒l�� ���ׂĂ�ϊ����Ă���Ƃ�����̂�����܂��B

�܂��t�B�[���h�̒l���n�b�V��������ꍇ�ɁA�n�b�V���̒l�̂��ׂĂ�ϊ����Ă���܂��B

package Book;
use Simo;

sub title{ ac default => { main => 'Good nesw', sub => 'yha' } }
sub author{ ac default => [ 'Kimoto', 'Taro' ] }

���Ƃ��Ώ�L�̂悤�ȃt�B�[���h�ł�����ꍇ�́A

$book->filter_values( sub{ uc }, qw/title author/ );

�Ƃ���ƁA�z��̑S���̒l�ƁA�n�b�V���̑S���̒l���啶���ɕϊ�����܂��B

6-9 �����̃t�B�[���h�̒l��G���R�[�h�A�܂��̓f�R�[�h����B encode_values, decode_values

��L�́Afilter_values ��encode�֐�, decode�֐���K�p������̂��A�p�ӂ���Ă��܂��B

$book->encode_values( 'utf8', q/title author/ );

$book->decode_values( 'utf8', q/title author/ );

�̂悤�Ɏg�p���܂��B

6-9 XML����I�u�W�F�N�g�𐶐�����B new_from_xml

XML����I�u�W�F�N�g�������邱�Ƃ�ł��܂��B

�ȉ���XML��Ă��������B�܂�ŃI�u�W�F�N�g�̂悤��XML�ł��B

<?xml version="1.0" encoding='UTF-8' ?>
<root __CLASS="Book" >
  <title>Good man</title>
  
  <author __CLASS="Person">
    <name>Kimoto</name>
    <age>28</age>
    <country>Japan</country>
  </author>
</root>

�N���X���̕\����

__CLASS="Book"

�Ƃ�����̂��g���Ă��܂��B

my $book = Simo->new_from_xml( $xml );

�Ƃ����L�q�ł��̂悤��XML���͂��āA�I�u�W�F�N�g�𐶐����邱�Ƃ��ł��܂��B

$book->author->name;

�̂悤�ɐ[���K�w�̃I�u�W�F�N�g�������ꗘ�p�ł��܂��B

�R���X�g���N�^����new�ł͂Ȃ��ꍇ�́A

<root __CLASS="Book" __CLASS_CONSTRUCTOR="create" >
</root>

�̂悤�ɁA__CLASS__CONSTRUCTOR �� �R���X�g���N�^����w�肵�Ă��������B

6-10 XML��ɃI�u�W�F�N�g�̃t�B�[���h�l��ݒ肷��B set_values_from_xml

�g����́Anew_from_xml �Ƃ悭���Ă��܂��B

Book�I�u�W�F�N�g�͍쐬����Ă��āA ���L�̂悤�ȃf�[�^��I�u�W�F�N�g�ɐݒ肵�����ꍇ�ȂǂɎg�p���܂��B

<?xml version="1.0" encoding='UTF-8' ?>
<root>
  <title>Good man</title>
  
  <author __CLASS="Person">
    <name>Kimoto</name>
    <age>28</age>
    <country>Japan</country>
  </author>
</root>

�ȉ����T���v���ł��B

my $book = Book->new;
$book->set_values_from_xml( $xml );

7. �Ō��

�Ō�܂œǂ�ł���Ă��肪�Ƃ��������܂��B